linux下SMC的实现
关于SMC我在前面的文章中已经提到过,正好这次需要为新生赛出题,第一反应就是想到SMC技术,于是开始鼓捣有关SMC的实现,对于一个ELF文件而言,程序主要包含三个段,.text段,.data段和.bss段,.text段主要是用来存放代码,其权限为可读,但不可写,这是为了保护代码在执行过程中不被意外修改,.data段是用于存放已初始化的全局变量或静态局部变量,其权限为可读写,.bss段则是存放已初始化为0的全局变量以及未初始化的全局变量,其权限也是可读写。
mprotect函数实现SMC,关键在于修改数据以及修改权限,mprotect函数的作用就是修改某片内存对应的属性,其函数原型如下
123#include <unistd.h>#include <sys/mmap.h>int mprotect(const void *start, size_t len, int prot);
start为修改内存的起始位置,其必须是一个内存页的起始地址(内存页的起始地址为4096字节的整数倍),
len为被修改区域的长度,一般设置为内存页大小的整数倍
prot为修改后的属性 ...
BUUCTF[网鼎杯2020青龙组]signal
简单看了一下main函数,第一感觉就是vm题,这是第一次做vm题,看起来较为简单,权当vm题的入门,个人对vm题的理解为利用代码实现基本操作,可以理解为手撸一个CPU,然后用这些自己定义的操作来实现真正想要的操作。
这里的vm_operad函数就是实现vm的关键函数,上面的qmemcpy函数实现了复制功能,并将v4传入了vm_operad函数,可以猜测v4就是opcode,查看unk_403040和vm_operad函数的实现逻辑后更加确定v4就是opcode
vm_operad函数部分代码:
根据vm_operad函数的逻辑,恢复出v4所实现的逻辑,脚本如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510 ...
chicken_soup
根据题目提示,猜测程序被添加了花指令,ida打开查看
这里的loc_401000/401080很明显是解析出现错误的表现,查看汇编窗口
可见这里有一个永恒跳转和垃圾数据0xe9的存在,可以将上面两句跳转指令nop掉,并将垃圾数据0xe9修改为0x90,再重新创建函数,就可以看到真正的函数
最终的代码流程如上图,剩下的就是逆算法的问题了,两个judge函数的逻辑也很简单,很简单就可以写出脚本,如下
12345678910111213141516c = [205, 77, 140, 125, 173, 30, 190, 74, 138, 125, 188, 124, 252, 46, 42, 121, 157, 106, 26, 204, 61, 74, 248, 60, 121, 105, 57, 217, 221, 157, 169, 105, 76, 140, 221, 89, 233, 215]def change_bits(c): for i in range(len(c)): tmp = c[i] c[i] = (tmp%16) ...
git上传文件到远程仓库
123456789101112131415161718192021222324252627282930# 首先创建需要上传文件的文件夹,在该文件夹中初始化本地仓库git init # 生成.git隐藏文件夹#添加远程连接的地址git remote add origin http://xxx.git #后面这个地址可在github上找到#将本地仓库和远程仓库同步git pull origin branch #branch是你所需要同步的分支,默认为master#将当前目录的全部文件添加(该命令需执行,否则后面可能会出错)git add .#给上传的文件添加备注(该命令需执行,否则后面可能会出错)git commit -m "information" #information可任填#如果在本地仓库中没有创建分支的话,需要先创建对应的分支git branch branch_name #branch_name为你需要在远程仓库传文件的分支,可能master分支无需创建,未曾细究#切换分支git checkout branch_name #默认在master分支,切换后在终端 ...
L!S!
学到的知识点:bindiff工具的使用,ida数据文件i64的生成,CyberChef的使用
出题人给出了两个二进制文件,分别为ls-original和ls-patched,提示我们找出两个二进制文件的不同,这里就要给出一个非常好用的工具Bindiff,它就是为了让使用者可以迅速地找出两个二进制文件的不同,Bindiff的下载可以在网上搜,教程一大把,非常简单。这里从这道题出发,讲解Bindiff的使用
生成i64文件Bindiff是在数据库文件上进行操作的,直接将二进制文件拖入是没有任何作用的。并且Bindiff还需要和IDA配合使用。生成i64文件也需要IDA。只需要将文件拖入IDA中,再退出即可。注意,在退出IDA的时候,要选择Pack database选项,这样才能生成i64文件
这样子你就得到了两个i64文件,一个是ls-original的,一个是ls-patched的。然后将ls-patched.i64拖入ida中
选择Edit,再选择Plugins中的BinDiff,将ls-original.i64载入,注意:ls-original.i64路径不能包含中文,否则可能会 ...
对ChatGPT的研究
对ChatGPT模型的研究1. 引言2022年11月30日,OpenAI推出了ChatGPT聊天机器人,旨在通过用户的提示来和人类进行对话。它的交互界面简洁,只有一个输入框,并且ChatGPT支持在同一个语境进行持续地交互。ChatGPT一经推出,便引发巨大的轰动。无论是让它写一首诗,还是编写一个程序的代码,回答人类随机提出的问题,撰写文章等任务,ChatGPT总能作出具有一定参考意义的回答。本文旨在对ChatGPT的原理进行分析,深入浅出地讲解ChatGPT的实现过程。
2. 原理介绍chatGPT是一种大型语言模型(LLMS)的扩展,LLMS模型能够读取学习大量文本数据,并推断文本中单词间的关系,可以理解为一种完型填空,该模型旨在预测出在给定的单词序列中的空白位置填入一个合适的词。在此之前,首先来分析chatGPT的前身,Generative Pre-training Transformer(GPT)模型。
2.1.GPT模型原理GPT模型是生成式预训练模型,是OpenAI在Transformer架构上提出的模型。首先对Transformer模型进行介绍,之后分别对GPT系列的模型 ...
NSSCTF wordy
日常ida打开二进制文件,点开main函数发现点不开,出现一大堆数据
应该是使用了花指令,一开始以为是第一句的jmp塞入了垃圾数据导致后面的反编译失败,修改后仍然没有变化,说明还有其他地方需要修改。在看了wp之后才知道原来出题人塞入了不止一个垃圾数据,因此需要写个脚本来将垃圾数据修改掉,脚本如下:
12345678from idc_bc695 import *startaddr = 0x1144endaddr = 0x3100for i in range(startaddr, endaddr): if get_wide_byte(i) == 0xeb: if get_wide_byte(i+1) == 0xff: patch_byte(i,0x90) print("[+] Addr {} is patched".format(hex(i)))
脚本2:
12345678from idc_bc695 import *startaddr = 0x1144endaddr = 0x310 ...
安卓逆向
分析工具 jadx安卓逆向题一般提供一个apk包,jadx可以用于对apk文件进行分析,它可以反编译出源码进行分析,不过jadx只能够查看源码,不能对反编译的代码进行修改
使用方法在jadx安装文件夹中找到jadx-gui-版本号-jar,使用java打开就能出现图形化界面,直接将需要分析的apk包拖入即可
修改工具在一些题目中,可能需要对源码进行一些修改,例如点击100000次,或者是代码中存在一个判断条件使得获得flag的语句永远无法执行,这是需要对源码进行修改,对apk包修改的方法就是将apk进行解包,然后再解包出来的文件中找到smail文件,根据你需要的修改的位置进行查找,进行修改,修改后重新将文件打包为apk文件,注意,打包后的apk是无法安装的,因为缺少了签名文件,在打包后我们还需要将apk包使用签名工具进行签名
apktool来到apktool安装的目录下,同时将apk文件放在同一目录下
解包命令(二选一):
java -jar apktool.jar d apkname.apk
apktool.bat d -f apkname.apk objectFolderPat ...
XSCTF决赛逆向部分wp
【简单】babyre这道题使用了花指令,比较友好,花指令是没有修改到寄存器的,是一个无用指令直接nop掉
修改后的反编译结果
进入函数中查看一下
是简单的对输入字符串进行处理,然后进行比较,根据代码进行编写脚本即可。如果题目中对数据的处理出现了或(|)操作,一般使用暴力破解,该题使用了暴力破解的方式,不知道是否有其他更好的做法,脚本如下:
12345678910111213141516171819data = [0x66,0x7,0x2c,0x3b,0x7b,0x19,0x66,0xa1,0x31,0x5a,0x2f,0xfa,0x36,0x5f,0xc6,0xcb,0x5f,0x19,0x66,0xb3,0x33,0x19,0x6e,0x99,0x40,0x16]flag = ''for i in range(26): if i & 3 != 0: if i % 4 == 1: flag += chr(data[i]^0x6b) elif i % 4 == 2: for j in ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
