檢查一下保護:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1YjZmVDNwUWZ3gDNlZmM5cjYkRTZmZTZhZ2N3cjZlFzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
拖進IDA分析程式:
問題處在write函數中,
最後可以溢出一個位元組.
思路:溢出一個位元組覆寫下一個chunk的prev in use标記位.然後向前合并,構造重疊chunk。
下面是我的構造方法:
- create三個這樣的chunk
buuoj刷題記錄 - roarctf_2019_easy_pwn - free掉0 ,然後利用chunk1 覆寫掉chunk2的prev in use 标記位.同時在chunk1内布置好prev size.(glibc-2.23不會通過prev size 找到chunk ,然後比較前一個chunk的size,是以我們隻需要修改chunk2的prev size就可以了)
-
接着free掉chunk2,此時這個大chunk就都到了unsorted bin裡面了.但是此時我們還是可以通路chunk1裡面的内容.
(注意在建立三個chunk的時候再往後面加一個,防止合并到top chunk)
- 在unsorted bin裡面劃分出幾塊記憶體(大小自己決定,保證之後能改掉chunk1的内容),使unsorted chunk向後移動,直到fd和bk指針落在chunk1内,這樣我們就能通過chunk1把fd和bk打出來了.
- free掉chunk1,利用剛才劃分的chunk改寫chunk1的fd指針到malloc_hook附近.
6.連續malloc兩次,配置設定到malloc_hook附近,寫malloc_hook
最後比較坑的地方是one_gadget 一個也不能用.原因是rsp 不滿足條件.
學習了一下大佬們的做法:
把malloc_hook改為realloc函數内sub rsp 的位址來調整rsp,
之後realloc會立刻檢查realloc_hook,然後決定是否執行realloc_hook
隻需要把realloc_hook改為one_gadget即可.
(realloc_hook就在malloc_hook的前面)
雖然sub rsp調整的rsp的位置,但是由于棧内的資料不會被置0,也就是說sub了之後,裡面的資料還是随機的,并不一定能滿足one_gadget的rsp 條件.
最後執行流程就是:
malloc_hook -> sub rsp -> realloc_hook -> one_gadget
成功getshell