32位无壳,拖入ida反编译
findcrtpto扫一下加密
有aes加密,追踪一下,发现是sub_4020d0内进行加密,base64在aes里。改个名开始看函数主体的逻辑。
GetModuleHandleW函数返回指定模块的句柄,进入402320看看。
不知道值是啥,动调一下
这里v3是‘.text’,动调往下跑了一会后在第二轮break了。。
这里隐藏着一个点。这个函数是void类型,但是在反调试函数后有一个return,这会导致程序异常。很难不想到seh的存在
v3+=40后变成了.sctf,继续在数据段往下看看,+=40后是.data 可见是数据段的名字。
分析下一个函数。
前三行是一段反调试,看看404000是什么
sctf数据段,放着一堆数据,很难不想到smc
往回找找哪里进行了smc加密(基本确定藏在异常处理函数里)。
在上一个函数中发现了一点东西。__except_handler4是seh异常处理函数的标志。没法反编译,看汇编吧。
这段代码是设置函数的栈帧和设置数据,为异常调试做准备。
手动反编译下面的函数sub_402450
异或在取反,这里笔者本来想patch掉反调试函数后自动解密,不知为何patch后一片飘红。。。
所以使用脚本解密(快捷键shift+f2)
add1=0x404000
add2=0x405000
key="sycloversyclover"
bb=0
for i in range(add1,add2,1):
wr=(~(idc.get_wide_byte(i) ^ ord(key[bb%len(key)]))&0xff) #这里&0xff是避免取反时高位补一
ida_bytes.patch_byte(i,wr)
bb+=1
操作后得到正常代码,反编译看看逻辑
每个字符减一再逆序,写脚本解密
nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo=
是个base64的形式,应该就是aes的密文
返回我们刚刚标记好的解密函数,找寻密钥
发现两个很像密钥的。分析代码采用cbc模式加密
猜一下哪个是密文哪个是偏移向量即可。
flag{Ae3_C8c_I28_pKcs79ad4}