LCTF2018-pwn4fun-詳細解析
LCTF-pwn4fun-詳細解析
LCTF真的有一點勸退的意思。。。膜一波出題人,當時自己沒有做出來,和大佬交流了一下思路之後會了。感覺題目是很新奇的,因為有點像是現實環境中邏輯漏洞利用。
程式分析
題目的程式碼很多這裡列出一些主要的
我這裡標出了一些函式的大概名字,這裡說一些簡單的函式首先admin是把字串admin先放在一個地址裡,然後接下來name函式就是輸入自己的名字,就如上面執行圖片展示的,然後開始遊戲
dont_know
這個函式剛開始標為dont_know是因為我開始看的時候並不知道是什麼意思。。然後就繼續看了下面,現在我們來看看這個函式,首先我這裡將一個變數命名為了file_neme因為我發現它把值賦給了file,然後後面有一個openfile的操作,感覺這裡有些不對勁,可能可以有些開啟flag檔案的操作,因為有一個congratulate的字串在這裡,但是這裡並沒有被怎麼呼叫
輸入比較函式
這裡會有一個比較讓我們輸入不能等於admin
這裡有4個運算元,首先是do something,然後是do something again,然後是do something else,然後是do nothing,這裡do nothing會執行一個退出的操作.接下里具體講講其他選項
choose 1 & do something
可以發現它對一個byte型別數進行了一個賦值,這裡原來是一個數字,但是我發現這個是在可見字元的範圍裡所以我直接r了一下,進行了一個轉換。看看這個地方並沒有什麼bug額。
choose 2 & do something again
這裡和第一個操作時差不多的,所以就不多解釋了,也是對那個位置進行一個賦值,先記住這個字串以為之後可能會用到。接下里的3就不進行分析了,是差不多的函式,無非就是blood不相同
最後一個函式
這裡有一個很明顯的格式化字串漏洞,但是我怎麼也做不到成功的贏,在上面blood迴圈之中,這個遊戲類似於卡牌遊戲一樣,可以進攻然後可以放棄此輪迴合,也可以吃了對方的牌,當然對於題目本身來說肯定是會有丟棄卡牌的環節,這裡就是一個可以利用的地方了
溢位點在丟牌處
這裡在第二次丟牌的時候沒有檢查下表所以可以直接進行一個數組越界的覆蓋
動態除錯
這個地方是我用ida動態除錯的時候發現的,在admin的情況下會進行一個open file的操作,可是open出來的是一個。。。
這裡可以發現是一個假的flag。。。太服氣了這一點了,所以我們還是要繼續尋找。繼續尋找的過程中可以發現在丟牌的時候有一個下表溢位會讓我們可以覆蓋到flag那個地方,這也就用到了
這個地方可以進行一個下表越界-5對4進行一個a覆蓋
思路分析
進入第二個選項的丟牌然後讓下標進行一個溢位,溢位-5,進行一個flag的佈置然後就可以讀取flag了,當讓這裡的admin需要加上‘’將9個字串填滿
from pwn import * p=process('sgs.dms') def get(x): p.recvuntil(str(x)) def put(x): p.sendline(str(x)) p=remote('212.64.75.161', 2333) get(name) put('n') get(?) put(U) get(name) put(Hadreys) p.sendline('2') #這裡就開始自己手打遊戲了,首先進入第二次棄牌階段然後,然後輸入-5使的file_name被我們覆蓋,這裡要 #進行6次成功覆蓋後,就可以執行下面的指令碼按ctrl + c就可以了。 p.interactive() put('admin'.ljust(9.'')) #遠端端可以通。。本地不太行額 p.interactive()
ps:這裡請教了一下lm0963,膜一波,一個人拿了兩個pwn-fd
總結
這幾次的比賽在pwn上會有很多的新題,其中最大的感受就是對pwn手的逆向要求更高的了,就比如湖湘杯的pwn1,程式碼量也很大,而還有這個lctf的這道題目需要先知道程式的功能才能pwn。還有之前出現過的vmpwn。。。