在ctf比赛中, 有时我们需要对可执行文件进行patch, 或者在植入后门时,patch也是常用的手段。不过手工patch比较麻烦,下面介绍几个工具。
博客地址:9e7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6B7K9h3&6&6N6e0l9H3i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5`.
地址:a67K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9N6h3&6A6P5r3u0G2j5$3S2K6i4K6u0r3M7r3q4@1j5$3S2C8K9i4c8Q4x3X3g2Y4K9i4b7`.
1.由于链接器的原因暂时还不能使用 libc 中的函数,所以所有要做的事情都需要我们自己实现。用 c 或者 asm
使用方式:./patch binary_file patch.py
./patch binary_file patch.py
过滤printf中 %n 的脚本。
64位程序,修改 malloc函数的参数为 0x20
0x20
32位,由于与栈进行操作,要注意保存还原返回地址
或者
程序地址:854K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9h3g2X3i4K6u0V1M7s2u0G2K9X3g2U0N6q4)9J5c8V1I4u0c8f1j5`.
使用这个工具可以很方便的 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 脚本
参考:
8bcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9K9h3g2X3i4K6u0W2M7i4g2S2M7X3E0K6L8r3q4T1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0i4K6u0r3N6s2g2@1L8%4u0A6j5h3I4K6i4K6u0r3
4e1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9N6h3&6A6P5r3u0G2j5$3S2K6i4K6u0r3M7r3q4@1j5$3S2C8K9i4b7`.
[培训]科锐逆向工程师培训第53期2025年7月8日开班!