鏈接見標(biāo)題萍恕。
這個題其實不需要IDA這些工具尸疆。
首先我們先checksec start:
沒有防護(hù)機(jī)制,想想也是危尿,畢竟只是一個start。
接下來我們objdump來看一下匯編代碼:
很短小馁痴。我們看到了兩個int 0x80谊娇,這是用來進(jìn)行系統(tǒng)調(diào)用的。
我們用gdb先給0x8048060下斷并運行:
接著我們繼續(xù)執(zhí)行罗晕,直到這里:
我們知道了前面的幾個push就是把這一串字符串給送入棧中了济欢。接下來第一個int 0x80應(yīng)該就相當(dāng)于write,第二個就相當(dāng)于read小渊。
執(zhí)行到這里法褥,我們看到ECX與ESP指向同一片內(nèi)存。而ESP是棧頂指針酬屉,這意味著程序?qū)@一片內(nèi)存執(zhí)行寫入操作半等。后面那個add操作,讓ESP增加20呐萨,同時ret酱鸭。我們知道,ret相當(dāng)于 pop EIP垛吗,所以凹髓,執(zhí)行了add后的ESP指向的內(nèi)存存儲的就是返回地址。
因此我們可以通過覆蓋這一片內(nèi)存來達(dá)到控制程序的目的怯屉。但是蔚舀,它們指向的都是棧內(nèi)存,而棧內(nèi)存每次運行都不同锨络,因此我們需要動態(tài)獲取地址赌躺。
我們注意到在四個push之后有一個ESP給ECX賦值的操作,然后才調(diào)用的write羡儿,因此我們猜測它輸出的應(yīng)該就是ECX指向的地方礼患。如果我們的程序在執(zhí)行完read后能再回到這個地方,我們就能獲得read的時候的ESP掠归,我們就可以知道我們應(yīng)該往哪里注入shellcode了缅叠。
注意到mov 操作的地址是:0x8048087,
我們打開終端虏冻,然后:
獲取到了執(zhí)行寫操作的時候的ESP地址肤粱。這時候我們構(gòu)造shellcode,可以百度到厨相。
shellcode =?'\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
為什么不能用shellcraft.sh()構(gòu)造shellcode呢领曼?我也不知道鸥鹉。
接下來我們構(gòu)造新的payload。
現(xiàn)在還是在寫操作庶骄,但是我們已經(jīng)知道了ESP的地址毁渗,也就是寫操作開始的地址(棧從上往下是從低到高的,寫操作是從上往下寫的)单刁,我們將ESP+0x14的地方保存的地址覆蓋成我們的shellcode的開始地址祝蝠。
payload = 'A' * 20 + p32(leak + 20) +shellcode
為什么要寫leak+20呢?因為我們將shellcode寫到了leak+20的地方啊:)??
所以最后ret的時候EIP就會跳到leak+20這片椈眉睿空間,就會執(zhí)行這里的命令了细溅。
所以最后如下:
運行結(jié)果:
最后在home/start/找到了flag:
FLAG{Pwn4bl3_tW_1s_y0ur_st4rt}
另褥傍,這個最好寫成腳本,因為時間一長服務(wù)器會自動斷開連接喇聊,就得重來恍风。