文章作者: XOR Hex
博客地址: https://blog.xorhex.com/
原文链接: Flare-On 2017: Challenge 3
翻译前言: 这是解决Flareon4第3题的第3种方法. 文章中使用angr编写python脚本来获得flag, 对比之前我翻译的使用Unicorn框架的文章里的代码, 对于刚接触Angr或Unicorn的朋友会有不少帮助.
ps: 程序可以从附件下载, 程序可能会报毒但是安全的, 建议在虚拟机下操作, 解压密码: www.pediy.com
如果朋友想看我之前翻译的用其他两种全新的方法解决该题的文章, 可以点击以下链接:
我们用IDA打开文件并调到入口点, 入口点简单地调用了函数sub_401008
我们打开这个函数看看, 向下滚动我们可以看到看起来像成功提示的文本字符串, 接下来的标准流程就是找寻成功的分支.
从字符串往回分析, 我们发现一个在0x40105E
处的比较, eax
跟值0xFB5E
进行比较.
如果eax
匹配成功, 那么随后程序就会继续执行成功分支. 所以我们该如何满足这个匹配呢?
来看看sub_4011E6
函数内部. 我们看到一堆的mov
,add
,shl
和shr
指令, 这可能是某种形式的混淆. 让我们看看传入进函数的参数:
第1个参数存储在eax
寄存器中而第2个参数这是值0x79
. 注意, eax
包含的是0x40107C
的偏移量而第2个参数0x79
看起来很可能是一个表示长度的参数. 我们细细检查函数sub_4011E6
就能证实这点. 也就是说程序即将修改如下所示的汇编代码片段.
并没有变量传入解混淆代码, 所以猜测应该是需要某种形式的用户输入, 所以我们继续看.
来到下一个代码块, 我们看到相同的汇编代码区段0x40107C
在传入函数sub_4011E6之前
由xor
和add
指令进行修改.
xor
的值存储在dl
, 而dl
总是从[ebp+buf]
赋值而来, 这看上去就可能是我们的用户输入了. 继续向上跟踪我们看到[eax+buf]
则是作为参数传递给函数sub_401121
快速浏览函数sub_401121
, 我们看到0x4011BC
处设置了[ebp+buf]
函数的剩余部分则仅仅只是服务器接受输入后的一些操作
总结一下收获:
在我们开始写脚本解答之前, 我们需要提取那些混淆过的字节出来.
这里我使用IDAPython脚本来提取字节
现在我们可以进入下一步, 写脚本!
我们知道从网络接收的长度是4字节, 但是聪明的读者可能已经注意到代码中使用dl
赋值给buf
而非edx
, 也就导致实际值的范围是从0x0
到0xff
(dl
只有1字节大小). 我们脚本的开始部分类似如下:
接下来我们需要修改提取出的比特使得通过比较检查. 我们需要通过解混淆的两部分.
对于第1次的解混淆(0x401039
), 我们可以用python简单写一个"解码器".
要记住第1步解混淆操作应该放在for循环块中.
在Angr
的帮助下, 我们可以继续按我们的方式进行第2阶段的解混淆, 虽然有点像作弊, 但谁又想用python或c重写一遍解混淆的代码呢?
在for
循环之前一行声明一个angr
工程实例, 这样它就不会在每次for
循环执行时重新创建一遍.
设置Angr模拟执行sub_4011E6
, 不过我们这次需要放到for
循环里去.
虽然我意识到在这里使用Angr可能有点过犹不及, 但它是我手上最新的工具, 所以我所有的问题都以Angr的方式来解决.
接下来我们需要检查ax
的输出是否匹配0xFB5E
现在我们已经满足了校验值匹配, 我们将解混淆的代码输出到屏幕上
我们猜测这应该是汇编代码. 我们使用Capstone
反编译代码.
再次运行脚本, 我们可以确定这是汇编代码并且填充入缓冲区的内容里出现了ASCII字符.
既然我们能够手动将上面汇编中可显字符的十六进制转换成字符, 我们为什么不用脚本来完成这一工作呢. 修改for
循环:
最后运行脚本得到flag
总体上我们解决题目用的静态方法十分有趣, 同时也让我有机会首次在CTF竞赛中使用Angr
和Capstone
. 一开始我使用的是Angr 6
来解决该问题, 但后来因为在CTF的中途Angr
更新新版本, 所以写脚本的时候用的是Angr 7
. 如果我随后使用了Unicorn
引擎和Angr
再次解决的话我会回来更新这篇文章.
完整的脚本代码你可以在这里找到: greek_to_me_angr7.py
.text:00401047 mov eax, offset loc_40107C
.text:0040104C mov [ebp+var_C], eax
.text:0040104F push 79h
.text:00401051 push [ebp+var_C]
.text:00401054 call sub_4011E6
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)