首页
社区
课程
招聘
[翻译]使用Angr解决Flareon4题目3
发表于: 2017-12-23 19:54 9238

[翻译]使用Angr解决Flareon4题目3

2017-12-23 19:54
9238

文章作者: 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
entry_point.png
我们打开这个函数看看, 向下滚动我们可以看到看起来像成功提示的文本字符串, 接下来的标准流程就是找寻成功的分支.
success_message.png
从字符串往回分析, 我们发现一个在0x40105E处的比较, eax跟值0xFB5E进行比较.
eax_comparison_check.png
如果eax匹配成功, 那么随后程序就会继续执行成功分支. 所以我们该如何满足这个匹配呢?

来看看sub_4011E6函数内部. 我们看到一堆的mov,add,shlshr指令, 这可能是某种形式的混淆. 让我们看看传入进函数的参数:

第1个参数存储在eax寄存器中而第2个参数这是值0x79. 注意, eax包含的是0x40107C的偏移量而第2个参数0x79看起来很可能是一个表示长度的参数. 我们细细检查函数sub_4011E6就能证实这点. 也就是说程序即将修改如下所示的汇编代码片段.
obfuscated_assembly_code.png
并没有变量传入解混淆代码, 所以猜测应该是需要某种形式的用户输入, 所以我们继续看.
来到下一个代码块, 我们看到相同的汇编代码区段0x40107C在传入函数sub_4011E6之前xoradd指令进行修改.
first_deobfuscation_routine.png
xor的值存储在dl, 而dl总是从[ebp+buf]赋值而来, 这看上去就可能是我们的用户输入了. 继续向上跟踪我们看到[eax+buf]则是作为参数传递给函数sub_401121
sub_401121_call.png
快速浏览函数sub_401121, 我们看到0x4011BC处设置了[ebp+buf]
call_to_recv.png
函数的剩余部分则仅仅只是服务器接受输入后的一些操作
总结一下收获:

在我们开始写脚本解答之前, 我们需要提取那些混淆过的字节出来.
这里我使用IDAPython脚本来提取字节

现在我们可以进入下一步, 写脚本!

我们知道从网络接收的长度是4字节, 但是聪明的读者可能已经注意到代码中使用dl赋值给buf而非edx, 也就导致实际值的范围是从0x00xff(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竞赛中使用AngrCapstone. 一开始我使用的是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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢作者以及翻译者的辛勤劳动
2018-3-22 17:14
0
游客
登录 | 注册 方可回帖
返回
//