您當前的位置:首頁 > 動漫

CTF: pwn題小記錄(2)

作者:由 ValK 發表于 動漫時間:2019-09-28

這一題有了點pwn的味兒了,不過大佬們還是說這只是個小遊戲(awsl)

CTF: pwn題小記錄(2)

我現在拿到了一個IP地址和埠,顯然這是要我nc進去。為了保護這個IP不被迫害,不放出來了。同時我還拿到了一個zip,解壓之後獲得了一個ELF檔案,現在要做什麼還不清楚,我們先在linux下跑一跑看看。

CTF: pwn題小記錄(2)

就在我對著這四個數發愣的時候,突然跳出來個Alarm clock,結束了程式。還有時間限制的嗎?????

接著我試圖隨便輸入幾個數字,但是無功而返,只得到了時間結束的提示。

但是我現在還是沒有頭緒,於是我打算nc一下:

CTF: pwn題小記錄(2)

那看來,這玩意就好像是個門衛一樣,攔住了我。那麼下面要做的事情很粗暴:

反編譯!

CTF: pwn題小記錄(2)

又看到了這個令人害怕的介面,那就直接反編譯到C來看看吧。

CTF: pwn題小記錄(2)

這一眼望過去,不太對勁,整個程式好像沒有過多的要素能被你發現。但是不難發現,v7這個資料決定了你會不會進入/bin/sh,最後的if判斷證明了這一點。

但是麻煩的事情又來了,整個程式裡面沒有一個地方是直接更改v7的,而我們的輸入,是提供v4的值,接著read函數里會有一個v5[v4]的呼叫操作。顯然突破口應該就在這個下標處。

C編譯出的陣列有一個特點,即空間連續,且有一個頭指標,v5即為char v5[15]的頭指標,而v5陣列一共有15個連續空間,下標0~14,v6同理。但是同時還有一個很有趣的事情,那就是:

假設有這樣的空間情況:

char v5[15]的空間地址從1~15,而還有一個char 空間在v5的後面,也是這個程式申請出來的。

眾所周知,char v5[15],下標是0~14,那麼如果你寫v5[15]=‘\0’;那你就會改動後面那個char空間,如果這個空間不屬於該程式申請的空間,你可能會收穫系統贈送的SIGSEGV或者SIGTRAP一個~

但是如果碰巧這個空間也屬於你這個程式,那麼這個v5[15]=‘\0’;會確確實實改動這一塊空間。這就是指標的神奇和靈活之處。

那我們來研究一下注釋:

CTF: pwn題小記錄(2)

很有趣的事情發生了。v5首地址在sp+10h,而v6的首地址是sp+11h,也就是在v5+1的地方,這兩個陣列居然大部分空間重合!

接著分析一下v7的位置。v7的地址是sp+1Fh,也就是說,在v6首地址往後的……emmm幾位來著?

v6(0) v7(14)

11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f

v6在11,v7在1f,那麼v7其實就是v6[14],也就是v5[15]!

啊哈,那麼事情就解決了,read函式時會呼叫到v5[v4],這時候再輸入一個ASCII不是99的字元把v5[v4]的值改成這個字元的ASCII值,如果v4是15,那麼v5[15]的數值就會被更改,也就是v7的值會變動,從而不是99,在接下來的if中,判斷就會成立,就會呼叫system(“/bin/sh”);我們就順利進入了這個資料夾下。

事不宜遲,趕緊nc一下,打敗這個“門衛”。

CTF: pwn題小記錄(2)

迅速輸入15然後打下ls命令……唔,忘了輸入一個字元這樁事情了,不過l的值不是99,算是成功改值了,顯示出/bin/sh的時候,就意味著我已經成功打進去了。但是我們還要拿到flag不是嗎?再ls一下看看。

CTF: pwn題小記錄(2)

看到一個檔案叫做flag,用cat指令看看。

CTF: pwn題小記錄(2)

成功!

標簽: V5  15  V7  V4  char