1、题目拿到是的一段C代码。
看到write 和 read 函数,猜测可以用栈溢出来getshell。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void vulnerable_function() {
char buf[128];
read(STDIN_FILENO, buf, 512);
}
int main(int argc, char** argv) {
write(STDOUT_FILENO, "Hello, World\n", 13);
vulnerable_function();
}
2、生成可执行文件。
通过gcc编译可执行文件,加上参数 -fno-stack-protector -o -z execstack -o 禁用CANARY和NX栈保护机制。
gcc -fno-stack-protector -z execstack -o level5 level5.c
再执行命令关闭本机的地址随机化,降低一下难度。
# echo 0 > /proc/sys/kernel/randomize_va_space
3、checksec查看一下文件的保护机制。
(这里看到有PIE,但是由于我们关闭了本机上的地址随机化,仍可以当作PIE disable)
4、ida查看文件。
可以看到,read只申请了80h的栈空间,但是可以读进去200h的数据,所以可以利用栈溢出来getshell。
5、构造通用gadgat泄露write的地址,以获取libc。
------------------------------------------------------------------------------------------------------------------------------
在一些64位的可执行文件中,一般使用libc,就会有个libc初始化函数,如下: