BUUCTF [SCTF2019]creakme 题解

32位无壳,拖入ida反编译

cd65ac3a4a0a4e7298dc0d9fcc27a7fa.png

findcrtpto扫一下加密

60dc8839afe84f869024b0be5c52a08d.png

有aes加密,追踪一下,发现是sub_4020d0内进行加密,base64在aes里。改个名开始看函数主体的逻辑。

GetModuleHandleW函数返回指定模块的句柄,进入402320看看。

80f9e3ed9d09484eb098e47a40dc1c54.png

不知道值是啥,动调一下

dda7261f22c14871a5c87e11de0f31fe.png

这里v3是‘.text’,动调往下跑了一会后在第二轮break了。。

这里隐藏着一个点。这个函数是void类型,但是在反调试函数后有一个return,这会导致程序异常。很难不想到seh的存在

v3+=40后变成了.sctf,继续在数据段往下看看,+=40后是.data 可见是数据段的名字。

分析下一个函数。

81006bdc9cdb46db9ff72da56d74f4f3.png

前三行是一段反调试,看看404000是什么

1df5fe9985874817b7046ebfe59e1529.png

sctf数据段,放着一堆数据,很难不想到smc

往回找找哪里进行了smc加密(基本确定藏在异常处理函数里)。

7e886ceacf834a49bbeb6a11892d7013.png

在上一个函数中发现了一点东西。__except_handler4是seh异常处理函数的标志。没法反编译,看汇编吧。

这段代码是设置函数的栈帧和设置数据,为异常调试做准备。

手动反编译下面的函数sub_402450

966193d2129541899917adfb516bf455.png

467476823d1c4091b33c385bdfa0d535.png

异或在取反,这里笔者本来想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

操作后得到正常代码,反编译看看逻辑

6507ee51d22b43288abfc67969395cd2.png

每个字符减一再逆序,写脚本解密

fbf220297b46495aa514b91dfde64bd0.png

nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo=

是个base64的形式,应该就是aes的密文

返回我们刚刚标记好的解密函数,找寻密钥

4d5058bf0cd0498aa08d59beea2334a7.png

4f209ac5cd894c7999386d3a15efc389.png

08d6470c59c1416c80d9186688939e10.png

发现两个很像密钥的。分析代码采用cbc模式加密

猜一下哪个是密文哪个是偏移向量即可。

1ce075da0390465facdc411249f48331.png

flag{Ae3_C8c_I28_pKcs79ad4}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值