Home avatar

Wings

Pwn ret2text in x86

ret2text 的意思是返回到特定代码段.

程序被装载后, 在(虚拟)内存中是这样的:

Linux进程地址空间布局 (图源 «程序员的自我修养»)
Linux进程地址空间布局 (图源 «程序员的自我修养»)

调用一个函数的时候, 内存中栈上的数据是这样排列的:

栈帧 (图源 «程序员的自我修养»)
栈帧 (图源 «程序员的自我修养»)

其中, 返回地址Return Address 指的是函数执行完成之后, 要执行的下一条指令的地址.

可以看到, 栈是从高位向低位增长的, 而数组是从低位向高位填充的. 也就是说, 如果 数组越界 不加处理, 我们可以 覆盖掉返回地址, 从而控制程序的运行.

然而, 在开启了 栈不可执行保护NX 的程序中, 我们不能够在栈中写入 shellcode, 覆盖掉返回地址一般来说是程序代码段中的内容.

call 指令先 push 下一个命令的地址(返回地址), 再 jmp. leave 是恢复上一个栈桢, retpop eip.