欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

juckcode writeup

程序员文章站 2022-05-15 11:23:51
...

这是某市的大学生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]=0x90

for 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]=0x90

w=open('bacjuck.exe','wb')
w.write(bytes(r))
w.close()
f.close()

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

juckcode writeup

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

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

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

juckcode writeup

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

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

比如是
ABC=
BCD=
CDE=
DEF=

juckcode writeup

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

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

juckcode writeup

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

juckcode writeup

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

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

import base64

s1='aaa@qq.com@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))