被覆盖的PTRACE_POKETEXT修改

时间:2016-08-20 20:14:14

标签: c ptrace

使用下面的代码我在特定地址注入一个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   

0 个答案:

没有答案