我正在学习计算机安全课程,有一项额外的学分作业要求将可执行代码插入到缓冲区溢出中。我已经获取了目标程序的c源代码并且成功地覆盖了当前函数堆栈帧的eip。但是,我总是得到一个段错误(Segmentation fault)提示,因为提供的地址总是错误的。问题在于当前函数位于pthread内,因此堆栈的地址似乎在程序的不同运行之间总是变化的。是否有方法可以找到pthread中的堆栈地址(或估计pthread中的堆栈地址)?(注意:pthread_create的第二个参数为null,因此我们没有手动分配堆栈地址)
strcpy()
溢出字符缓冲区。溢出会覆盖堆栈上保存的返回地址(已保存的 IP),使其指向缓冲区内部的 JMP 指令。JMP 指令跳转到 CALL 指令,该指令调用/bin/sh
的execve()
,所有这些都已作为 shellcode 复制到缓冲区中。文章后来建议在溢出缓冲区的前面填充 NOP 指令,以便返回地址只需要指向 NOP 中的某个位置即可。 - jschmier