juckcode writeup

来源:互联网 发布:淘宝流量券在哪里查看 编辑:程序博客网 时间:2024/05/18 00:20

这是某市的大学生ctf比赛里面的题,本来看着分值只有200,想着应该不是很难,结果弄了我几个小时。。。。

首先用ida打开,扫了一下,发现有些地方反编译不出来,应该是花指令,用ida手动修了几个,发现只有两种花指令,而且格式都一模一样,那直接写个脚本来去花指令吧

a=b'\x8B\xEC\x6A\xFF\x68\x33\x22\x11\x00\x68\x11\x22\x33\x00\x64\xA1\x00\x00\x00\x00\x50\x64\x89\x25\x00\x00\x00\x00\x58\x64\xA3\x00\x00\x00\x00\x58\x58\x58\x58\x8B\xE8\xB8\x50\x10\x40\x00\x50\xE8\xC3'f=open('juckcode.exe','rb')da=f.read()r=list(da)for i in range(len(da)-1):    if(da[i]==0x8b and da[i+1]==0xec):        if da[i:i+len(a)]==a:            for q in range(len(a)):                r[q+i]=0x90for i in range(len(da)-12):    if(da[i]==0xf and da[i+6]==0xf and da[i+1]==0x8E and da[i+2]==0x7 and da[i+12]==0xe8):        print("find! %s"%str(hex(0x401000+i-1024)))        r[i+12]=0x90w=open('bacjuck.exe','wb')w.write(bytes(r))w.close()f.close()

运行完之后,应该把花指令都去了,但是有个函数还是反编译不出来,看了下报错的地址,应该是call 了C++里面的ostream ,这里应该就是把结果给输出,所以nop掉这个call指令也没什么所谓。(话说我没nop掉,全程看汇编看得好辛苦。。。)

这里写图片描述

这里应该就是main函数,首先打开flag文件,不存在的话就输出 error in open flag

然后下面有几个函数点进去看一下,都是一层套一层,最后基本都是return this,动态调试下来的感觉就是一个工具函数,把二级指针里面的内容提取出来

真正比较有用的是sub_401350,动态调试下来,感觉是一个base64encode (其实一开始看到sub_401000()里面传了个长度为64的字符串,还以为是变种的base64,结果在sub_401350动调了一下,发现每次都会把那个字符串给还原为一般的base64的字符串,encode和decode结束之后又会恢复回去

这里写图片描述

这里是main函数,看到调用了4次base64的函数,分别是对原始输出base64一次,然后每个字符+64再base64一次,再对上一个操作的结果向左移7位 base64一次,最后对上一个操作的结果 +98 base64一次

这个时候就有四个base64encode后的字符串

比如是
ABC=
BCD=
CDE=
DEF=

这里写图片描述

这里的操作就是把encode后的字符串组合起来变成 ABCDBCDECDEF

因为是4的倍数,所以可以直接把这个字符串拿去sub_4017D0这个函数decode

这里写图片描述

decode完的东西,再用%.2hhx 格式化输出到一个缓存区里面

这里写图片描述

最后再每一个加上16,就是我们看到的一长串奇奇怪怪的字符串

这个时候要解密其实很简单,因为原始的字符串也被encode进去了,所以只要提取属于原始字符串的那一部分出来decode就可以了

import base64s1='FFIF@@IqqIH@sGBBsBHFAHH@FFIuB@tvrrHHrFuBD@qqqHH@GFtuB@EIqrHHCDuBsBqurHH@EuGuB@trqrHHCDuBsBruvHH@FFIF@@AHqrHHEEFBsBGtvHH@FBHuB@trqrHHADFBD@rquHH@FurF@@IqqrHHvGuBD@tCDHH@EuGuB@tvrrHHCDuBD@tCDHH@FuruB@tvrIH@@DBBsBGtvHH@GquuB@EIqrHHvGuBsBtGEHH@EuGuB@tvrIH@BDqBsBIFEHH@GFtF@@IqqrHHEEFBD@srBHH@GBsuB@trqrHHIFFBD@rquHH@FFIuB@tvrrHHtCDB@@'s2=[ord(i)-0x10 for i in s1]s3=[]for i in range(0,len(s2),2):    s3.append(int(chr(s2[i])+chr(s2[i+1]),16))s4=str(base64.b64encode(bytes(s3)))[2:-1]s5=''for i in range(0,len(s4),4):    s5+=s4[i]print(base64.b64decode(s5))
原创粉丝点击