使用下面的代码我在特定地址注入一个INT3。
unsigned long data = ptrace(PTRACE_PEEKTEXT, child_pid, 0x4173c0, NULL);
ptrace(PTRACE_POKETEXT, child_pid, 0x4173c0, (data & 0xFFFFFFFFFFFFFF00) | 0xCC);
printf("%lx\n", ptrace(PTRACE_PEEKTEXT, child_pid, 0x4173c0, NULL));
正如预期的那样,这将打印以CC结尾的数据。但是当我再次运行最后一行时,我的程序中的后者
printf("%lx\n", ptrace(PTRACE_PEEKTEXT, child_pid, 0x4173c0, NULL));
显示没有CC的原始数据。是什么导致我的修改被覆盖?内存是重新映射还是什么?当重置INT3时,我该怎么做才能防止这种情况发生或发现?
编辑:
objdump -d
00000000004173c0 <final_term_get_text_menus_by_code>:
4173c0: 55 push %rbp
4173c1: 48 89 e5 mov %rsp,%rbp
4173c4: 48 c7 45 f0 00 00 00 movq $0x0,-0x10(%rbp)
4173cb: 00
4173cc: 48 8b 05 dd bd 26 00 mov 0x26bddd(%rip),%rax # 6831b0 <final_term__text_menus_by_code>
4173d3: 48 89 45 f0 mov %rax,-0x10(%rbp)
4173d7: 48 8b 45 f0 mov -0x10(%rbp),%rax
4173db: 48 89 45 f8 mov %rax,-0x8(%rbp)
4173df: 48 8b 45 f8 mov -0x8(%rbp),%rax
4173e3: 5d pop %rbp
4173e4: c3 retq