checksec 查看保護機制 guess
只有一個保護,
發現程序自己把讀取flag到了棧中,所以思路就是:
1.通過覆蓋argv[0]先泄露puts的地址
2.通過泄漏的puts的地址,計算出基地址然後泄漏出environ的地址(也就是棧的地址),爲什麼泄漏environ:https://www.jianshu.com/p/cc9d09a3f65f 有詳細的解釋
什麼是environ?
就是保存的環境變量,就是libc裏面的一個symbol_symbol_environ
想要得到environ,只有通過libc_add2,纔可以得到,
這道題主要就是得到stack__add2
附圖:中間有出現 xxxxxxxxxx00是canary
裏面”./gueaa’就是打印
3.找到flag和environ的偏移(就是找到flag在棧上的位置)
打開ida看一下
裏面有可以 ./fext.flag
找到handle函數
可以看到輸入是用fget函數處理的,限制了輸入的長度,所以不好溢出。再看看flag_correct( )函數。
裏面用到一個fork函數,就是一個複製一個,都是複製一模一樣的,就這存在漏洞,
首先看子類返回一個,父類返回pid
其實這道題就是先用父類繼承,得到pid
難的是就是子類得到0.
第二步就是
如何通過通過覆蓋argv[0]先泄露puts的地址,用到就是在gdb
start
下斷點 b *0000000000400B23
c
n “aaaa“就是argv[0】地址
stack 100
**確定要可控字符串與argv[0]之間的距離
0x7fffffffe198-0x7FFFFFFFE070=0x128(296)
在environ下斷點
flag和棧地址之間的距離 0x7fffffffe1a8-0x7fffffffe040=0x168(360}腳本: