首页
社区
课程
招聘
[原创]看雪CTF2018-第四题writeup
2018-6-22 22:53 2500

[原创]看雪CTF2018-第四题writeup

2018-6-22 22:53
2500

0x00 去除花指令

用IDA打开程序,定位到main函数

jz,jnz到同一个地址,明显是花指令,用IDA的快键键U和C调整一下,再分析发现一共执行了这三条有用指令后(push ebp;mov ebp, esp;sub esp, 7Ch),跳转到loc_403136处执行

不难发现是作者自己把main函数的流程更改了,先在函数起始处加了跳转,然后加了一些花指令,故只需要用IDA的插件Keypatch修改回原样即可

继续往下看,发现还有花指令

直接把.test:00403156到.text:00403167的代码全部修改为nop,然后删除一些函数的定义,重新修改函数的结束点,就可以用IDA的F5进行分析了,后面的函数还有花指令一样处理即可

0x01 程序大致流程分析



发现函数前面有利用时间差反调试,然后有一个解密字符串的函数sub_401078(ps:后面一直有用到这个解密函数),解密函数比较简单,只是把字符串依次异或1到字符串长度。
继续分析发现,有一个反调试的函数sub_40100A(),在里面判断了当前进程的父进程是否为explorer.exe,如果不是就将dword_495728赋值为1(dword_495728后面会用到),如果是则创建一个新的CrackMe进程,然后将dword_495728赋值为2,但创建新的CrackMe进程后,原程序就崩溃了,新进程执行时,dword_495728还是会被赋值为1,这个反调试就没有起到效果,感觉这里是作者的代码写的出了问题,故这个函数可以不用管。

然后解密了success和error两个字符串,对输入的长度做了判断,必须小于等于23,并把输入分为了2部分A和B,前3个字节为A和后面的字节为B,并把B转化为了ASCII码的16进制字符串,分别执行函数sub_40128F()和sub_40125D()进行判断。

0x02 RSA解密算法分析


在IDA的字符串窗口中发现了MIRACL等字符串,得知程序静态链接了MIRACL大整数库。
函数sub_4095A0(500, 0x10u)初始化了一个结构体,解密函数sub_401078()对字符串M和N进行解密,执行了4个sub_409350(0)函数初始化了4个结构体,然后sub_40D1E0()函数把字符串转为结构体,sub_40C110((int)v3, e, (int)v6, v4)则对B,N,e进行运算,产生结果result与M比较。
随便输入数据12345678901234567890动态调试程序得到16进制字符串M,N和B
M=208CBB7CD6ECC64516D07D978F5F0681F534EAD235D5C49ADD72D2DB840D5304
N=7da39de66016477b1afc3dc8e309dc429b5de855f0d616d225b570b68b88a585
B=3435363738393031323334353637383930
e=3e9
result=689BCC818A134619C585F795660A24881843BDAF076A8B46AE521EF2A8166081
由于result<N,e=3e9特别小,猜测是做了B^e mod N运算,用python测试了一下,发现结果真的是这样。
于是在网上随便找了个在线分解大整数的网站对N进行分解,然后写python脚本进行RSA解密。
解密得到B部分为iamahandsomeguyhaha1

0x03 爆破前三个字节


用IDA的插件Findcrypt发现有AES算法。
猜测是将A[0],A[1],A[2]+ dword_495728当做明文的前三字节,与1314000000000拼接用pediy加密与16进制字符串912CA2036A9A0656D17B6B552F157F8E比较。dword_495728在反调试函数中被修改为1,但用自己写AES解密程序解密出来后,发现结果不一样,可能是自己分析错了,也有可能作者修改了AES算法,但由于只有3字节并且全为数字,我选择了修改程序进行爆破。
修改以下地址的汇编代码为如下
004032B2 | 8D 55 C4 | lea edx,dword ptr ss:[ebp-3C]
004032B5 | FF 02 | inc dword ptr ds:[edx]
004032B7 | EB BF | jmp 0x403278
然后在004032A4处下断点,输入000iamahandsomeguyhaha1
等待程序暂停,然后查看0019FF04处内容

发现为520,故输入的第一部分为520
综上所述,注册码为520iamahandsomeguyhaha1


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回