原文地址:http://www.mathyvanhoef.com/2012/11/common-pitfalls-when-writing-exploits.html
我的exp只在gdb调试状态下正常运行
没有提升权限
就像这个passwd文件的权限分配情况
root@bt:~# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 37140 2011-02-14 17:11 /usr/bin/passwd
改动这个文件需要root权限,简而言之,不同的权限的用户,相同的操作会有不同的结果。gdb通过root权限运行,所以若exp只在gdb调试状态下正常运行,检查下当前运行权限
不同的栈地址
程序运行时会将当前环境变量存储在stack中,gdb与直接运行程序会造成不同的环境变量,从而造成了某些变量的栈地址变化,栈结构如下图所示,图中可以看到它几乎影响了所有栈地址位置的变化
lower addresses
esp
[argv]
[envp]
higher addresses
一种简单的解决方法是通过这个项目来统一环境变量https://github.com/hellman/fixenv
采用fixenv项目来统一环境变量,例如
./r.sh ./vuln
./r.sh gdb ./vuln
栈对齐
编译器为了栈对齐,从而进行填充(padding)导致栈地址的变化
more see :http://www.mathyvanhoef.com/2012/11/common-pitfalls-when-writing-exploits.html