[SCTF2019]creakme1

文章详细描述了使用IDAPro分析一个程序的过程,涉及GetModuleHandleW函数、SEH异常处理、未反编译的函数sub_402450以及SMC(Self-MonitoringandControl)技术。作者通过动态调试发现AES和base64加密的使用,并揭示了密钥和偏移量,最终解密得到flag。
摘要由CSDN通过智能技术生成

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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值