调试环境是ubuntu16 64位
这次开启了DEP、ASLR(知道libc.so情况下)
还是参考了《一步一步学ROP之linux_x64篇》这篇文章。
代码是1.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void vulnerable_function() {
char buf[128];
read(STDIN_FILENO, buf, 256);
}
int main(int argc, char** argv) {
vulnerable_function();
write(STDOUT_FILENO, "Hello, World\n", 13);
}
gcc -fno-stack-protector -o 1 1.c
开启ASLR:
sudo -s
echo 2 > /proc/sys/kernel/randomize_va_space
exit
首先获取几个变量:
main函数地址:
yang@yang-virtual-machine:~/test$ objdump -d 1 | grep main
400410: e8 4b 00 00 00 callq 400460 <__libc_start_main@plt+0x10>
0000000000400450 <__libc_start_main@plt>:
400494: e8 b7 ff ff ff callq 400450 <__libc_start_main@plt>
0000000000400587 <main>:
yang@yang-virtual-machine:~/test$
可以看到main函数地址是0x400587。
.bss段的首地址:
yang@yang-virtual-machine:~/test$ readelf -S 1 | grep bss
[26] .bss NOBITS 0000000000601040 00001040
yang@yang-virtual-machine:~/test$
可以看到.bss段的首地址是0x601040
介绍一下linux64位的函数传参方式,是通过rdi rsi rdx rcx r8 r9依次入栈的 (Windows64位是rcx rdx r8 r9依次入栈的)。所以如果需要调用函数,就需要控制rdi rsi等寄存器,而不仅仅是控制栈了。
这就需要寻找相关代码了,在libc.