Pwnable.tw-Secret Of My Heart
Author: 堇姬Naup
libc
glibc all in one 中沒有 2.23-0ubuntu5
所以去網路上找libc
https://launchpad.net/ubuntu/xenial/amd64/libc6/2.23-0ubuntu5
把i386載下來
1 | dpkg -X libc6_2.23-0ubuntu5_amd64.deb . |
在libs裡面就有ld跟libc了
patchelf直接patch上去
1 | patchelf --set-interpreter ld-2.23.so secret_of_my_heart |
IDA分析
main
add+ADD
1 | int add() |
1 | _BYTE *__fastcall ADD(size_t *chunk, size_t size) |
可以malloc 0x100內的size
先輸入name,再輸入heart(存在malloc heap中),這裡多補了個NULL byte,有off by null
1 | pwndbg> x/30xg 0x5fd3388cb0d0 |
show
1 | int show() |
他會顯示該chunk上的資訊
可以拿來leaklibc之類的感覺
delete + Delete
1 | int delete() |
1 | __int64 __fastcall Delete(__int64 chunk) |
會去free對應的index,他會去清空heap arr,下次malloc就會拿到空的那塊重新寫chunk address,所以沒有double free
分析
有off by null就可以先打一些overlapping之類的了
不過在這之前先搞leak libc
可以打overlapping,讓一塊chunk活在free chunk中,那個位置是fd跟bk,這樣就可以拿到libc了
malloc 0x38 -> 拿到chunk0 0x40
malloc一塊0x100 -> 拿到chunk1 0x110 -> 之後會被蓋成0x100先預留prev size
再malloc一塊0x100 -> 拿到 chunk2 0x110
先free chunk 1
再free chunk 0
之後malloc chunk 0
並off by null蓋chunk 0 0x111為0x100
接下來
之後malloc 0x88 -> chunk 3 0x90
malloc 0x40 -> chunk 4 0x50
之後free掉0x88
free掉chunk 2
chunk 2 會去 merge前面一整塊
並進入到top chunk
但是卻存活著一塊chunk 4位於free之中
所以就malloc 0x80 -> chunk 5
malloc 0x100 -> chunk 6
多malloc一塊0x30,不然chunk 6會被丟到top chunk
剛剛好chunk 4 跟 chunk 6 fd 重疊
去free chunk 6後印出就會是libc
以上就是off by one製造overlapping來leak libc的過程
1 | from pwn import * |
接下來要製造任意寫,透過重疊來double free
來寫malloc_hook,觀察一下上方可以找到很多的7…,可以拿來做fake chunk
把前面留在free chunk 的overlapping chunk,調整成malloc 0x60(也就是chunk 4)
先 malloc 一塊 0x60 -> chunk 7 (與chunk 4 完全重疊)
接下來malloc一塊 0x60 -> chunk 8
這兩塊會從unsorted bin割出來
接下來free chunk 7
free chunk 8
再free chunk 4
就會有fastbin
1 | fastbin[0x70] -> chunk 7 -> chunk 8 -> chunk 7 -> ... |
接下來malloc一塊0x60 將 secret改成fake chunk
再來malloc 兩次後
再malloc一次就可以拿到fake chunk 了
1 | from pwn import * |
這邊我們將malloc hook改成onegadget
然而直接malloc無法觸發onegadget條件
所以可以利用之前的方法
用 double free 來觸發malloc hook上的onegadget
get shell
exploit
1 | from pwn import * |
後記
終於2000分了