对 ELF 可执行文件的简单代码注入
发布: (2026年3月3日 GMT+8 20:44)
3 分钟阅读
原文: Dev.to
Source: Dev.to
示例来源
/**
* Simple Code Injection
*/
#include
#include
#include
int main(int argc, char *argv[])
{
int i, num;
num = 10;
for (i = 0; i :
1149: f3 0f 1e fa endbr64
114d: 55 push %rbp
114e: 48 89 e5 mov %rsp,%rbp
1151: 48 83 ec 20 sub $0x20,%rsp
1155: 89 7d ec mov %edi,-0x14(%rbp)
1158: 48 89 75 e0 mov %rsi,-0x20(%rbp)
115c: c7 45 fc 0a 00 00 00 movl $0xa,-0x4(%rbp)
1163: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%rbp)
116a: eb 1d jmp 1189
116c: 8b 45 f8 mov -0x8(%rbp),%eax
116f: 89 c6 mov %eax,%esi
1171: 48 8d 05 8c 0e 00 00 lea 0xe8c(%rip),%rax # 2004
1178: 48 89 c7 mov %rax,%rdi
117b: b8 00 00 00 00 mov $0x0,%eax
1180: e8 cb fe ff ff call 1050
1185: 83 45 f8 01 addl $0x1,-0x8(%rbp)
1189: 8b 45 f8 mov -0x8(%rbp),%eax
118c: 3b 45 fc cmp -0x4(%rbp),%eax
118f: 7c db jl 116c
1191: b8 00 00 00 00 mov $0x0,%eax
1196: c9 leave
1197: c3 ret
确定要修改的指令
设置 num = 10 的指令是:
c7 45 fc 0a 00 00 00 movl $0xa,-0x4(%rbp)
c7–movl带 32 位立即数的操作码。45 fc– 位移-0x4(%rbp)。0a 00 00 00– 立即数0x0a(10),采用小端序。
该操作码的起始地址为 0x115c,立即数字节 0x0a 位于 0x115f。
修改二进制文件
使用十六进制编辑器打开可执行文件,将 0x115f 处的字节(0x0a)替换为 0x05:
$ hexedit ./main
定位到偏移 0x115f,修改数值,保存并退出。
结果
运行已打补丁的二进制文件:
$ ./main
输出:
#0
#1
#2
#3
#4
程序现在只循环五次,演示了通过直接修改 ELF 可执行文件中的机器码实现的简单代码注入。
注意: 该技术仅在不改变二进制整体布局的情况下替换字节时有效。若要更改指令长度或重新定位代码,则需要更高级的方法,这将在后续文章中介绍。