[BUUCTF-pwn]——xman_2019_format
[BUUCTF-pwn]——xman_2019_format
本小白終于想明白了, 第一個寫出來這道題的人, 好厲害感覺.
腦袋嗡嗡的, 這道題讓我想了一個上午竟然, 果然適當睡眠有助于思考, 睡一覺就想出來了.
也看過幾個題解不過,雖然解法相同,但是基本都木有將清楚, 每一步的原因是什么都木有說清楚. peak不才, 在這里試著詳細說明一下, 畢竟想了一個上午的東西,還是有必要好好總結一下的 .
peak小知識
- ALSR : 你們肯定都知道,不就是地址隨機化嘛有什么, 但是這道題如果你們不清楚具體的原理很有可能寫不出來. 對于32位的線 性地址來說,高四位為全局頁表,如果用隨機產生會影響對高位內存的映射能力,會產生大 量的內存碎片,低12位要考慮頁對齊,因而只能有16位來作為偏移量 . 可能不清楚, 舉個例子 0x080485AB地址 它只能0x10 0x10的修改. 同時高四位不會被修改, 同時由于頁對齊 , 也就意味著只有A 會被隨機化. 64位類似.
- %{offest}$n : 大家也不陌生, 就是格式化字符串修改. 可是你真的知道嘛, 有的只是套用公式, fmtstr_payload, 或者直接不明不白就用 n hn hhn 寫了
其實如果有 A->B->C. 那么如果 % $n指向A的話, 實際修改的是C.
思路
前面 嗶嗶嗶那么多開始直奔正題
首先這題給了我們一個backdoor, 后門函數, 地址為0x080485AB我們只需要將返回地址修改為這個就好
沒有棧溢出, 只有兩個格式化字符串漏洞, 前面有一個buf, 輸入的buf '|'之前的是第一個printf, 之后的是第二個printf
我們不能直接修改 eip,但根據剛才的peak小知識, 我們可以間接修改eip,
利用ebp鏈, 使得一個地址指向儲存eip的地址就好
第一步找到偏移偏移為10, 第一步將0xffa44088改為0xffa4403c也就是指向eip的地址, 不過由于地址隨機化,只需要改最后兩位保證最后為C就好, 我這里是0x0C, 當然 1C、2C、3C…都可以
第二次計算偏移,找到上一級的ebp, 利用格式化字符串將后門函數的地址寫入. 其實只需要修改低位就好, 高位同一個程序基本都是相同的.
可能還是有點迷糊
A->B->C 利用這個將C修改為了指向eip的地址.
B->C->D 此時C是指向eip的地址,那么D不就是eip嘛
不過由于地址隨機化, 所有我也不知道是0C還是什么C, 多循環幾次就好
exploit
from pwn import * while 1: #p = process("./xman_2019_format") p = remote("node3.buuoj.cn",26721)#gdb.attach(p, 'b printf')payload = '%12c' + '%10$hhn|' payload += '%34219c' + '%18$hn' p.sendline(payload) try: p.interactive() except: p.close()總結
以上是生活随笔為你收集整理的[BUUCTF-pwn]——xman_2019_format的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BUUCTF-pwn]——mrctf2
- 下一篇: [BUUCTF-pwn]——[极客大挑战