【pwnable.tw 系列】start

概述:本題是pwn的入門級(jí)題目,幾乎把所有利用的難度都降到最低,應(yīng)該只是用來讓入門者大致了解pwn題的玩法。

1变汪、首先f(wàn)ile start,可以看到這是一個(gè)32位的elf文件蚁趁,靜態(tài)編譯裙盾,同時(shí)保留了符號(hào)信息;

file start

2他嫡、然后checksec start番官,可以看到幾乎所有的安全緩解措施都關(guān)閉了,將利用的難度降到了最低钢属;

checksec start

3徘熔、用IDA分析start,可以看到這是一個(gè)非常簡(jiǎn)單的程序署咽,只有兩個(gè)函數(shù)start和exit,其中exit函數(shù)只是簡(jiǎn)單退出程序,主要分析start函數(shù)宁否。

start函數(shù)同樣非常簡(jiǎn)單窒升,主要做了兩件事:調(diào)用sys_write函數(shù)打印出20字節(jié)長(zhǎng)度的字符串"Let's start the CTF:"、調(diào)用sys_read函數(shù)讀入60字節(jié)長(zhǎng)度的字符串慕匠,這里很明顯存在一個(gè)棧溢出饱须,在這里先整理一下常規(guī)棧溢出的利用思路,因?yàn)楸绢}中存在各種故意設(shè)計(jì)的巧合導(dǎo)致利用起來很簡(jiǎn)單台谊,并不能完整反映出棧溢出的利用流程蓉媳。

棧溢出利用思路:

(1)確認(rèn)溢出點(diǎn),以及計(jì)算出溢出的長(zhǎng)度锅铅;

(2)判斷以何種方式覆蓋返回地址酪呻,即以什么復(fù)寫返回地址來達(dá)到劫持執(zhí)行流程的目的;

(3)將程序啟用的安全緩解措施逐個(gè)繞過盐须。

接下來玩荠,一邊分析start函數(shù)一邊解決上面三個(gè)問題。

start 函數(shù)

(1)start函數(shù)首先push esp贼邓,這是一個(gè)比較有意思的指令阶冈,本質(zhì)就是在棧上保存了這個(gè)棧內(nèi)存單元自己的地址,考慮到程序沒有開啟ASLR和PIE塑径,所以如果我們能將這個(gè)保存在棧上的數(shù)據(jù)泄露出的話就解決了利用思路中的第二點(diǎn)女坑,即以硬編碼的方式復(fù)寫返回地址劫持執(zhí)行流程到shellcode;

(其實(shí)用硬編碼的方式覆蓋返回地址是很少用的方式统舀,這種方式最簡(jiǎn)單匆骗,但是如果程序開啟了PIE使得棧地址隨機(jī)化或者復(fù)寫的返回地址存在壞字節(jié)都會(huì)使得這種方式失敗,常用的應(yīng)該是與地址無關(guān)的解決辦法)

(2)接下來push offset _exit绑咱,也就是將退出函數(shù)的地址壓入堆棧绰筛,這實(shí)際上是壓入函數(shù)的返回地址;

(3)接下來由于需要利用四個(gè)常用寄存器傳參描融,所以先將其清空铝噩;

(4)接下來是通過sys_write系統(tǒng)調(diào)用來輸出字符串"Let's start the CTF:",值得注意的是給ecx的傳參方式:mov ecx, esp窿克,表面上是將ecx指向上面push進(jìn)棧中的字符串骏庸,也就是要打印的字符串,但也要認(rèn)識(shí)到如果調(diào)用得當(dāng)我們可以通過這個(gè)參數(shù)輸出棧上的其他數(shù)據(jù)年叮,比如在push esp指令中壓入棧中的棧地址具被,這也是在解決利用思路中的第二點(diǎn),也就是泄露棧地址只损;

(泄露棧地址的前提是棧地址是固定的一姿,即沒有開啟PIE七咧,否則是沒有意義的。)

(5)接下來是通過sys_read系統(tǒng)調(diào)用來輸入60個(gè)字節(jié)的字符叮叹,這很明顯是棧溢出的溢出點(diǎn)艾栋,解決了利用思路中的第一點(diǎn)中找到溢出點(diǎn)的部分;

(6)接下來add esp, 14h蛉顽,也就是將棧地址拉高20個(gè)字節(jié)蝗砾,這是在清理自己使用的棧空間携冤,依此可確定溢出長(zhǎng)度為20個(gè)字節(jié)悼粮,這解決了利用思路中的第一點(diǎn)計(jì)算出溢出長(zhǎng)度的部分,其他復(fù)雜情況下的溢出長(zhǎng)度可以通過腳本來計(jì)算曾棕。

(實(shí)際上這一步涉及到不同語(yǔ)言的函數(shù)調(diào)用約定扣猫,傳參以及空間清理等,在此不展開討論)

(7)由于本程序沒有開啟NX或者canary睁蕾,同時(shí)棧地址固定且已知苞笨,可以直接把shellcode復(fù)寫在棧上劫持返回地址到shellcode,所以分析到這里就可以整理出完整的利用思路子眶。

4瀑凝、通過上面的討論基本確定了利用思路(方式有多種,這里用最簡(jiǎn)單的思路):

首先在函數(shù)運(yùn)行到讀入字符串時(shí)通過棧溢出將返回地址覆蓋為mov ecx, esp指令的地址臭杰,由于沒有開啟PIE粤咪,所以代碼段的地址沒有隨機(jī)化,這個(gè)地址是固定且已知的渴杆,這樣函數(shù)將把write和read系統(tǒng)調(diào)用再執(zhí)行一遍寥枝,而且在第二次執(zhí)行write系統(tǒng)調(diào)用時(shí)由于此時(shí)ecx指向第一條匯編指令push esp所保存的占內(nèi)存單元的地址,所以這次write系統(tǒng)調(diào)用會(huì)輸出那個(gè)棧單元的內(nèi)存地址磁奖,這樣我們就泄露出了棧地址囊拜,同時(shí)由于沒有開啟ASLR且不存在壞字節(jié)所以我們可以直接在第二次read系統(tǒng)調(diào)用中將shellcode溢出寫在這個(gè)地址開始的棧內(nèi)存中,并用這個(gè)地址覆蓋返回地址比搭,但是值得注意的是第二次還會(huì)有add esp冠跷,14h這條指令,所以實(shí)際覆蓋點(diǎn)還要調(diào)高20個(gè)字節(jié)身诺。

簡(jiǎn)單說蜜托,一共有兩次棧溢出,第一次復(fù)寫返回地址為 mov ecx, esp指令的地址來泄露棧地址霉赡,第二次溢出注入shellcode再利用第一次溢出獲得的棧地址劫持流程到shellcode橄务。

5、基于此思路寫的exp如下穴亏,其中shellcode部分直接使用80h中斷中的sys_execve(x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80):

# -*- coding:utf-8 -*-

"""

exp for pwnable.tw start.

by rafa.

"""

from pwn import? *

def exp():

? ? p = remote("chall.pwnable.tw", 10000)

? ? # 硬編碼覆蓋返回地址為 mov ecx, esp 指令所在地址

? ? payload = 'a' * 20 + p32(0x08048087)

? ? p.recvuntil(":")

? ? p.send(payload)

? ? # 第二次系統(tǒng)調(diào)用read時(shí)再次清理?xiàng)蜂挪?臻g調(diào)高20字節(jié)

? ? addr = u32(p.recv(4)) + 20

? ? shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'

? ? payload = "a" * 20 + p32(addr) + shellcode? ?

? ? p.send(payload)

? ? p.interactive()

if __name__ == '__main__':

??? exp()

執(zhí)行利用腳本獲得shell重挑,利用結(jié)果截圖如下:

start_exp.py

查看flag如下:

flag
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棠涮,隨后出現(xiàn)的幾起案子攒驰,更是在濱河造成了極大的恐慌,老刑警劉巖故爵,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隅津,居然都是意外死亡诬垂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伦仍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结窘,“玉大人,你說我怎么就攤上這事充蓝∷矸悖” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵谓苟,是天一觀的道長(zhǎng)官脓。 經(jīng)常有香客問我,道長(zhǎng)涝焙,這世上最難降的妖魔是什么卑笨? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮仑撞,結(jié)果婚禮上赤兴,老公的妹妹穿的比我還像新娘。我一直安慰自己隧哮,他們只是感情好桶良,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沮翔,像睡著了一般陨帆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鉴竭,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天歧譬,我揣著相機(jī)與錄音,去河邊找鬼搏存。 笑死瑰步,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的璧眠。 我是一名探鬼主播缩焦,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼读虏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了袁滥?” 一聲冷哼從身側(cè)響起盖桥,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎题翻,沒想到半個(gè)月后揩徊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嵌赠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年塑荒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姜挺。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡齿税,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炊豪,到底是詐尸還是另有隱情凌箕,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布词渤,位于F島的核電站牵舱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缺虐。R本人自食惡果不足惜仆葡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望志笼。 院中可真熱鬧沿盅,春花似錦、人聲如沸纫溃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)紊浩。三九已至窖铡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坊谁,已是汗流浹背费彼。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留口芍,地道東北人箍铲。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鬓椭,于是被迫代替她去往敵國(guó)和親颠猴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子关划,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容