天天看點

buuoj刷題記錄 - roarctf_2019_easy_pwn

檢查一下保護:

buuoj刷題記錄 - roarctf_2019_easy_pwn

拖進IDA分析程式:

問題處在write函數中,

buuoj刷題記錄 - roarctf_2019_easy_pwn
buuoj刷題記錄 - roarctf_2019_easy_pwn

最後可以溢出一個位元組.

思路:溢出一個位元組覆寫下一個chunk的prev in use标記位.然後向前合并,構造重疊chunk。

下面是我的構造方法:

  1. create三個這樣的chunk
    buuoj刷題記錄 - roarctf_2019_easy_pwn
  2. free掉0 ,然後利用chunk1 覆寫掉chunk2的prev in use 标記位.同時在chunk1内布置好prev size.(glibc-2.23不會通過prev size 找到chunk ,然後比較前一個chunk的size,是以我們隻需要修改chunk2的prev size就可以了)
  3. 接着free掉chunk2,此時這個大chunk就都到了unsorted bin裡面了.但是此時我們還是可以通路chunk1裡面的内容.

    (注意在建立三個chunk的時候再往後面加一個,防止合并到top chunk)

  4. 在unsorted bin裡面劃分出幾塊記憶體(大小自己決定,保證之後能改掉chunk1的内容),使unsorted chunk向後移動,直到fd和bk指針落在chunk1内,這樣我們就能通過chunk1把fd和bk打出來了.
  5. free掉chunk1,利用剛才劃分的chunk改寫chunk1的fd指針到malloc_hook附近.

6.連續malloc兩次,配置設定到malloc_hook附近,寫malloc_hook

最後比較坑的地方是one_gadget 一個也不能用.原因是rsp 不滿足條件.

學習了一下大佬們的做法:

把malloc_hook改為realloc函數内sub rsp 的位址來調整rsp,

buuoj刷題記錄 - roarctf_2019_easy_pwn

之後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

buuoj刷題記錄 - roarctf_2019_easy_pwn

繼續閱讀