0%

wordy 至少说了一些思考过程的WP

2024-04-21 04:29By
tywwwwwwwyt
花指令C逆向技术动态调试逆向

Problem: [GFCTF 2021]wordy

[[toc]]

思路

1.原则上笔者只做Windows平台的题目,但是看题目标签包含花指令——这是笔者遇到的第一个明确带有花指令的题目,再想想之前那么多的python题目也做了,所以想了想还是学一学吧
2.由于对花指令可以说是一窍不通,所以直接看WP。连续打开5、6个WP查看,发现果然很多WP都是“会了的看了连连点头,不会的看了还是不会”,要么是“根本没有说明思路直接上了答案/思路说得太少,特别是分析行为变化的转折原因根本没有提到”——笔者认为无法提供泛型思路、无法将学习到的知识运用到其他逆向过程(无论是游戏逆向、CTF还是软件破解)的WP都是无效WP(你至少说一下你思考了什么吧),于是只能结合多个WP进行研究。
3.承接“2”,大部分WP直接给你脚本,啥都不告诉你,好一点的来一句“打开后进入main函数,发现错误,花指令”——但是如何发现main函数呢,多数WP都没有细说?事实上,本题的花指令就在main函数内,导致其无法被IDA识别,也就无法从函数窗口搜索。
笔者归纳总结:
此时需要使用【内存数据搜索法】,但是搜索的地方不是函数窗口,也不是字符串窗口,而是在IDA中使用菜单栏的搜索项,选择文本,再文本中输入main——注意,main会在程序的多处被使用,所以活用搜索“下一个文本(CTRL+T)”功能,直到找到main函数为止;当然这种情况只只适用于“main函数在被花时仍能被IDA识别到”的情况,其他情况等遇到相关题目再进行总结
还有一种方法,对于简单的程序而言,由于知道存在花指令(或者猜测存在花指令),所以直接将光标移动IDA上端彩色导航栏的棕红色部分,有一定几率可以看到被花指令祸害的函数。
4.找到main函数后发现的确被插花,但是如何确认究竟是何种花指令呢?使用【汇编指令异常识别法】,应用【识别花指令的情况】:首先注意到标红的跳转标识,其次确认该jmp指令之后就是无法被识别的字节码,最后再看到该跳转本身抵达的地址是loc_1144+1——从这些特征可以判断,该jmp指令本身就是花指令。这也是相对最简单的一种花指令。
5.那么我们只要将jmp指令NOP掉即可。
点击菜单栏上的“编辑”,“修补程序”,“汇编”,输入nop,就能看到正确被解析的汇编指令(对于接触花指令不多的人来说,这里其实是存在问题的,例如“我怎么知道只要NOP掉0xEB,而不是将0xEB和0xFF两个字节码NOP掉呢”?笔者指出,一方面,这里就要学习硬编码、OPCode等知识;另一方面,可以多进行尝试,尝试发现NOP掉两个字节后代码反而识别总是不正确,就能反推只能NOP掉一个字节)。然后再看后续的花指令,发现和第一条jmp花指令是完全相同的情况。这样多来几次后就能发现,本题的花指令就是在正常的汇编指令中插入了0xEB,导致汇编引擎将指令们识别成了jmp跳转,所以只要将所有插入的0xEB全部改成0x90的nop即可。
6.一条条改可以,但是太麻烦了,所以推荐使用IDAPython的脚本功能。shift+F2唤出IDA的“执行脚本”窗口,根据题目给出的特征编写脚本解决问题。修改的代码范围可以上下拉动滑动窗口确认。
7.花指令解除后有两种解题办法。
第一种:笨办法,按c将整个代码块设置为可识别代码状态,然后F5转换成伪代码,将所有putchar的参数设置成字符并一一解读。
第二种:还是使用IDAPython脚本,根据特征规律,将所有0xC0的字节码之后两个比特位的虚拟地址上的字符打印出来,这些位置就是字符存在的地址位置。推荐使用更高版本的IDA,笔者的IDA 7.0使用2.7.13版本的Python,类似print(xxxx,end = '')的设置无法实施,需要升级工具版本解决。
8.得到Flag:GF�CTF{u_are2wordy},根据题目的提示,加上“NSSCTF{}”的外壳,得到flag:NSSCTF{u_are2wordy},提交显示flag正确。

EXP

  • 其他WP最不缺的就是脚本,看其他WP即可
  
© 著作权归作者所有
加载失败
广告
×
评论区
添加新评论

写的很详细哦,谢谢主包

需要更多这种人才,而不是隔壁那种傻逼

写的很详细

真实,我看这些wp真的一看一堆火

楼主给力,再配合图片流程就更完美啦