- Author:ZERO-A-ONE
- Date:2021-03-30
一、开头
相信很多PWNer/Biner在写EXP的时候都会遇上一个令人很抓狂的问题,就是自己明明在GDB里面调试得出的地址,经过自己十分精确的计算,一阵猛写EXP,打!然后进过一连串的跳动的命令行后,激动的开始准备夺取shell,然后,然后,segment fault(core dump)
,哦豁段错误,GG
这个是因为什么问题呢,其本质是因为正常程序运行时,会将环境变量字符串数组和命令行参数字符串数组存放在栈顶,而程序使用的局部变量等数据则位于这些字符串数组之后。环境变量字符串数组记录了诸如当前用户名、终端类型、搜索路径等环境信息
- 程序直接运行时,程序进程继承的是运行其的
shell
的环境变量, - 程序通过
gdb
运行时,程序进程继承的是gdb
的环境变量
这两者存在不同,从而会造成位于栈上的局部变量的地址发生改变。用户可在gdb
中运行show environment
命令获得环境变量参数
较之程序直接运行,通过GDB调试位于栈顶的环境变量主要有以下变化:
_
环境变量的内容发生改变,在程序直接运行时,_
变量存放的是程序的执行路径,而通过gdb运行程序时,_
变量存放的是gdb的执行路径- 通过 gdb 运行的调试程序继承了 gdb 的环境变量,其中包含新加入的