黑龙江省网络安全技能大赛 初赛 RE300 writeup ——Lilac 逆向组

来源:互联网 发布:mac能做什么 编辑:程序博客网 时间:2024/05/26 08:41

一个exe文件,下载地址:https://yunpan.cn/cvgXYFXCpf39p 访问密码 edfd
这个pe一打开是这样的:
这里写图片描述
与常规逆向不同的是,此题没有输入的地方,也没有提交flag的地方
注意到上面有个菜单栏,然而里面并没有什么有用的东西
于是程序丢到ida里面,经验让我搜索了一下程序中的字符串,找到了有趣的东西:
这里写图片描述
跟过去,到了一个函数里,这个函数是被混淆的,混淆点我比赛时已经处理了一下,但是处理得不够,所以ida还是不能很好的分析(原题我找不到了。。):
混淆点:
这里写图片描述
这两个跳转跳向同一个地址,相当于jump,而由于ida的分析原则是先分析使条件不成立的机器码,也就是下列这块代码是不可能执行的:
这里写图片描述
这就是混淆代码(代码块最前面的两个nop是我比赛时加的,当时没把这些都nop掉,导致ida还是无法正常分析),把他们全都nop掉,jz和jnz合并成jmp,得到新的程序,再丢进ida,来到同一段代码:
这里写图片描述
这时按f5就可以完整分析了,来到一个关键的比较语句:
这里写图片描述
显然,左边的代码块是失败的,右边的是成功的,让程序执行到右边我们就成功在望了,我们可以看到上面是一个strcmpi函数,这个函数比较的两个值如果相等,我们就能够跳到右边。
接下来看看这个函数在比较啥:
这里写图片描述
比较的是string1和var_2ec,往上看看这两个值分别存的是什么,经过一番查找,终于弄清了:
这里写图片描述
上面这个代码块就是对var_2ec的赋值,可以看到这里的语句是用ecx配合rep movsd来将一个内置字串的值移到var_2ec所在的地址,至于string1的值,可以在F5窗口中看到:
这里写图片描述
Sub_40101e使用了这个string1的地址,可能是做了某些修改,于是跟进这个函数:
这里写图片描述
发现里面一堆api,google之后发现这个是微软的hash算法:
这里写图片描述
可以看到这个函数的第二个参数是加密所选用的算法:
这里写图片描述
继续google这个参数的含义:
这里写图片描述
原来是个md5。
所以这个string1是经过一个md5加密的,加密之后的值应该还是存在了string1里。
现在已经知道strcmpi比较的是一个md5值和一个内置字符串,但是这个内置字符串怎么看都不像md5(MD5只有字母和数字),再仔细看程序,发现程序对这个内存值进行了亦或加密:
这里写图片描述
这里写图片描述
通过亦或解密出真正的md5:
这里写图片描述
也就是说string1在md5加密后如果是这个值,程序就会跳到右边执行,现在我们看看右边的代码:
这里写图片描述
这里又做了一次和上面相同的亦或运算(高亮处),这次是把var_1ec和另一个内置字串亦或了,现在只要弄清楚var_1ec是什么就行了,在上方的代码块可以看到关于这个var_1ec变量的引用:
这里写图片描述
原来这个变量就是加密以前的string1,既然这样,我们上网解密之前得到的md5值,就可以解出这个亦或的结果。Md5解码得到:
这里写图片描述
写脚本跑一下结果:
这里写图片描述
Flag get

总结:
这一题在比赛中没有做出来,有如下原因:
1. 在反返混淆的时候没有把不可能执行的指令都nop掉,导致不能f5,方便分析
2. 一直纠结于怎么输入的问题,认为string1的值跟输入有关,于是捣鼓了几个小时的api还是没结果,甚至直接忽略了关键的md5加密,所以以后做题还是要搞清楚程序的具体流程再着手google才行。。
3. 我总觉得这一题是可以通过更改程序执行流程直接打印出flag的。。。但是动态调试发现这个程序完全没有执行这段代码,通过交叉引用可以发现我们分析的函数最开始其实是被绑定到了一个窗口上:
这里写图片描述
消息循环绑定了我们的函数,然而我不知道怎么让他运行起来。。。。。有没有大神教教我。。。我的qq是574866810欢迎ctf爱好者来交流。

0 0