内嵌汇编练习
@[TOC]
定义
通俗点来讲,内嵌补丁就是把我们写好的补丁代码镶嵌在原有的代码里。
举个例子,假设这里有一个代码,随机的控制骰子的点数,现在要求我们不管什么时候,最后运行完骰子后点数都为6,我们该怎么办呢,由于不清楚代码里到底写了什么,是否有加密,所以我们不能随意的修改代码,而这里,我们采用内嵌补丁技术,只要在代码的末尾跳到我们的我们的补丁上,再写一句代码,让骰子的点数为6,再跳回去即可。
练习(Patchme)
文件
例子:https://pan.baidu.com/s/1j_LJ72KWmUtnGpp70r0weA
5ze1(百度网盘)
要求
要求更改显示的字符串
提示
1修改字符串,最简单的就是用od查找字符串,直接修改(不过和我们用的内嵌补丁无关)
这里如果修改字符串后,触碰到一些算法,那么就可能让代码流程发生变化,这也体现出内嵌补丁的优点
2如果代码有加密操作,类似upx这种,那么我们可能无法搜索到相关的字符串
分析1
按照上述方法我们可以先试着搜索字符串,果然没有
分析2
搞懂代码流程(遇见函数f7进去分析)
1进入401001加密代码
2第一个解密循环4010a3:对b区域异或44 (加密的字符串存在于b区)
3第二个解密循环4010c8: 对a区域异或7
4第三个解密循环4010db:对b区域异或11(在此处搜索字符串即可找到)
5校验循环401039,如果edx值判断成功则跳回程序正真的oep
补丁设置在何处
1文件的空白位置
每个节区之间都有填充,可以设置在那里,适用于添加少量代码
2添加新节区
需要添加节区头,添加新节区,修改节区数量,映像大小,节区属性等等操作,比较麻烦,适用于添加大量代码
分析3
我们在.txt节区后面添加代码,不过我们首先需要找到其位置
用小辣椒查看节区头
文件偏移400,大小400,用编辑器打开找到文件的空白区域(680-800)
od加载位置是401000,换算va即401280,我们就在这里写入我们的补丁
1 | mov ecx,0c |
并且在后面放上我们的字符串
分析4
补丁设置好了,那么什么时候jmp到补丁?
观察代码流程,选择401083即可
只需要修改汇编指令,jmp 401280即可
但是这里存在一个问题,这条代码是通过解密后所得的,他原属于a区域,异或了7才得到的,如果我们直接修改汇编指令,那么他下一次运行的时候还要再一次异或,那么代码就不知道会跑向哪里去了。
观察修改后的机器码 e9 f8 01 逆推一下让他异或7,变成ee ff 06 我们则只需要用编辑器修改三个字节即可。
结果
总结
内嵌补丁的学习是对pe文件学习的一个检测,如何找到每个节区的位置,如何换算rva到raw,如何添加节区或者利用节区的填充部位,都是学习pe文件的基本功,此外还有分析汇编代码的能力也是需要慢慢积累的。