[SCTF2019]creakme1

creakme1

题目下载:下载

载入IDA,看main函数[SCTF2019]creakme1_第1张图片

首先调用了GetModuleHandleW,用来获取应用进程或动态链接库的模块句柄,紧接着调用了2个函数。

先看第一个sub_402320(v3),将获得的句柄作为参数[SCTF2019]creakme1_第2张图片

与其匹配的是.SCTF区块,说明.SCTF与sub_402320函数有关系,在看一下他的汇编语言[SCTF2019]creakme1_第3张图片

有一个_except_handler4,他是SEH的异常处理标志,在往下看发现一个函数sub_402450,发现他并没有被反编译出来,可能和_except_handler4有关,根据别人的博客说,这个函数被反跟踪所以无法直接查看他的伪代码,手动跟进 sub_402450,[SCTF2019]creakme1_第4张图片

发现有个异或操作(这个用于后面的SMC)。 

接下来看主函数中的sub_4024A0函数[SCTF2019]creakme1_第5张图片

进行反调试,然后返回数据?跟进数据看一看[SCTF2019]creakme1_第6张图片

发现正好是.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之后把他变为代码形式,跟进:[SCTF2019]creakme1_第7张图片

进行动态调试这个函数,发现aPvfqyc4ttc2uxr字符串最后变为nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo=,然后在继续分析main函数的其他部分,发现很多函数,用插件看一下findcrypto主要的算法[SCTF2019]creakme1_第8张图片

发现用了AES和base64加密,跟进用了aes的函数观察,发现了两个字符串

 

所以一个是密钥一个是偏移,采用CBC模式,可以猜一下那个是密钥,哪个是偏移量,最终知道 sctfsctfsctfsctf是偏移量,sycloversyclover是密钥,所以在线解密[SCTF2019]creakme1_第9张图片

flag为sctf{Ae3_C8c_I28_pKcs79ad4}

你可能感兴趣的:(re简单题,base64,AES,SMC,动态调试)