creakme1
题目下载:下载
载入IDA,看main函数
首先调用了GetModuleHandleW,用来获取应用进程或动态链接库的模块句柄,紧接着调用了2个函数。
先看第一个sub_402320(v3),将获得的句柄作为参数
与其匹配的是.SCTF区块,说明.SCTF与sub_402320函数有关系,在看一下他的汇编语言
有一个_except_handler4,他是SEH的异常处理标志,在往下看发现一个函数sub_402450,发现他并没有被反编译出来,可能和_except_handler4有关,根据别人的博客说,这个函数被反跟踪所以无法直接查看他的伪代码,手动跟进 sub_402450,
发现有个异或操作(这个用于后面的SMC)。
接下来看主函数中的sub_4024A0函数
进行反调试,然后返回数据?跟进数据看一看
发现正好是.SCTF区块,所以这里应该是SMC,而操作就是上面的sub_402450,写一下脚本:
key='sycloversyclover'
addr1=0x404000
addr2=0x405000
j=0
for i in range (addr1,addr2,1):
data=(~(idc.get_wide_byte(i)^ord(key[j%len(key)]))&0xFF)
j=j+1
ida_bytes.patch_byte(i,data)
print('s')
在IDA中.如果我们想获取一个地址处的值可以使用以下几个函数:
旧的函数 新的函数 Byte(addr) idc.get_wide_byte(addr) Word(addr) idc.get_wide_word(addr) Dword(addr) idc.get_wide_dword(addr) Qword(addr) idc.get_qword(addr)
如何修改指令的值
旧函数 新函数 idc.PatchByte(addr,value) ida_bytes.patch_byte(addr,value) idc.PatchWord(addr,value) ida_bytes.patch_word(addr,value) idc.PatchDword(addr,value) ida_bytes.patch_Dword(addr,value) idc.PatchQword(addr,value) ida_bytes.patch_Qword(addr,value)
SMC之后把他变为代码形式,跟进:
进行动态调试这个函数,发现aPvfqyc4ttc2uxr字符串最后变为nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo=,然后在继续分析main函数的其他部分,发现很多函数,用插件看一下findcrypto主要的算法
发现用了AES和base64加密,跟进用了aes的函数观察,发现了两个字符串
所以一个是密钥一个是偏移,采用CBC模式,可以猜一下那个是密钥,哪个是偏移量,最终知道 sctfsctfsctfsctf是偏移量,sycloversyclover是密钥,所以在线解密
flag为sctf{Ae3_C8c_I28_pKcs79ad4}