原理与目的
程序在编译的时候会加入一些通用函数来进行初始化操作,所以可以针对初始化函数来提取一些通用的gadget,通过泄露某个在libc中的内容在内存中的实际地址,通过计算偏移量来得到system和bin/sh的地址,然后利用返回指令ret连接代码,最终getshell。
实验步骤
chechsec命令检查是否有canary保护
图中显示并没有,如果有的话,就先进行泄露。
IDA反汇编
int __cdecl main(int argc, const char **argv, const char **envp)
{
write(1, "Hello, World\n", 0xDuLL);
vulnerable_function(1LL, "Hello, World\n");
return 0;
}
通过看源代码可能看不出什么,我们来看一下vulnerable_function,
ssize_t vulnerable_function()
{
char buf; // [rsp+0h] [rbp-80h]
return read(0, &buf, 0x200uLL);
}
由此看出可以利用栈溢出来进行泄露,找到system和bin/sh。
32位和64位区别
linux_64与linux_86的区别主要有两点:
一是编址不同,内存地址的范围由32位