原文地址: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