在ctf比赛中, 有时我们需要对可执行文件进行patch, 或者在植入后门时,patch也是常用的手段。不过手工patch比较麻烦,下面介绍几个工具。
博客地址:https://jinyu00.github.io/
地址:https://github.com/lunixbochs/patchkit.git
1.由于链接器的原因暂时还不能使用 libc 中的函数,所以所有要做的事情都需要我们自己实现。用 c 或者 asm
使用方式:./patch binary_file patch.py
./patch binary_file patch.py
过滤printf中 %n 的脚本。
64位程序,修改 malloc函数的参数为 0x20
0x20
32位,由于与栈进行操作,要注意保存还原返回地址
或者
程序地址:https://github.com/lief-project/LIEF
使用这个工具可以很方便的 patch elf, pe,MachO 文件。本文以elf 为例。
elf
pe
MachO
通过交换导入导出符号
首先看第一个测试程序:
我们的目标是让他调用 puts 变成调用 system
puts
system
方案一
修改 libc 中的相关符号,然后使用 LD_LIBRARY_PATH 加载我们修改后的库。
LD_LIBRARY_PATH
首先拿到 puts 和 system 符号对象,然后交换他们的名称。
成功
方案二
直接修改目标文件的导入符号,代码如下
直接增加代码进行patch
测试程序:
目标是hook exp 函数,直接增加一个 segments , 然后劫持函数指针到这里。首先编译一个 lib 用来提供用于 hook 的代码。
exp
segments
lib
hook
hook.c 的内容:
然后看脚本内容,很清晰。
测试程序
hook.c 内容,hook memcpy, 打印内容。
hook.c
hook 脚本
参考:
https://lief.quarkslab.com/doc/tutorials/
https://github.com/lunixbochs/patchkit
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)