-
-
[原创]CTF2019 Q1 第六题write up
-
发表于: 2019-3-18 00:03 3398
-
系统 : Windows xp
程序 : Repwn
要求 : 输入口令 (两次)
使用工具 : ida / peid / ctf在线工具-进制转换 / 在线DES加密解密
首先将程序拖入peid中查看下,程序提示:MingWin32 - Dev C++ v4.x (h) *
使用插件进行算法识别,单击右下角=>
=>插件
=>Krypto ANALyzer
,提示发现算法常数:
看来涉及到了对称加密算法des。这里,直接用ida载入程序,然后按下Shift
+ F12
,发现关键字符串:.rdata:0040737C 00000021 C Key_Is_Wrong,Please_Input_Again!
双击定位具体地址:
双击数据交叉参考定位到关键代码,按下F5查看伪c代码:
由此函数可知程序列出了一个方程组,我们假设408020处字节数据为e1,408024处字节数据e2,依次类推,则:
最终,解得:
可知flag首部字符为20101001
。
在关键流程中,有这样一个函数:
由此可知,Flag中部为X1Y0uN3tG00d
。
在主流程中我们可以发现:
在执行过函数sub_4012F0
后,还执行了一个sub_401460
之后,直接返回了result,之后也没什么特殊动作:
而函数sub_401460
的流程十分之简单:
我们有理由相信,作者要开始点题了(RePwn)。此处,程序确认用户输入长度为24个字节后,开始将其拷贝入Dest指针指向的内存内,我们双击Dest查看函数栈视图:
我们输入的字符串长度为24个字节,从Dest起始处要覆盖掉函数返回地址也正好需要24(0x10+8)个字节。也就是说,作者在这里,强制引发了一个栈溢出漏洞。
那么,我们的程序执行流程接下来应该跳向哪里呢?
我的方案是,直接在system这个关键的函数上右击=>Jump to xref
:
双击查看第三个函数,发现没有被ida识别为函数,我们在函数首部:
在0x00401BF0处直接右击=>Create Function
就能使用F5
看伪c代码:
那么暂定需要跳转的地址为401BF0
,所以flag尾部的四个字符是HaCk
。
根据以上的信息,第一个Flag为20101001X1Y0uN3tG00dHaCk
,直接运行程序输入试试:
第二个谜题和我们之前用peid侦测出的des算法,程序结构非常相似:
在算法开始运作前有初始化密钥的操作:
注意,程序开始将我们的字符串转换为了binary数组:
最后却将密文换成了int数组:
最后将其和硬编码数据对比:
程序用密钥XiyouNet
加密了我们输入的八个字节的数据,将密文buffer转换成了int类型的数据。
那么将硬编码数据提取出来,将其再转换成buffer类型,就得到了真正的密文,然后用用密钥XiyouNet
解密就可以得到第二个Flag了。
按照以上逻辑,我们提取原始硬编码数据另存为y_txt.txt_o,编写如下python代码:
运行得到如下数据:
将数据拷贝至在线DES加密解密网站,填入密码和密文,解密得到的明文是Wel1C0me
。(作者的拼写。。。emmMm。。。)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)