path=%2Fhome%2Fspwnce%2Fwww%2Fdocs%2Fexamples%2Fhello.spy
path=/flag1
,然後瀏覽此網址當玩家連線到伺服器時,他們都會收到一個被加密的旗幟 。以下是用作加密的公鑰:
根據原始碼,密文是由一個有缺陷的 ElGamal 算法加密而成的。它會根據以下步驟算出密文 :
我們的目標是解密密文,並取得旗幟 。
在我們的 ElGamal 算法裡面, 並沒有取模數。因此 將會是 的倍數。如果我們多次連線到伺服器的話,我們將可得到數個密文 、 等等。由於 是 的倍數,所以
我們可以用歐幾里德算法來計算兩個數字的最大公倍數,其 Python 程式碼如下:
我們亦可使用下列關係來算出 之最大公倍數:
得出 後,我們要把它變成一個字串。由 chall.py
得知,旗幟是以 m = int.from_bytes(flag, 'big')
這一行來轉換成一個數字的。你可以研究一下怎麼使用 Python 的 int.to_bytes
來把數字變回來。
🏁 我把 變成一個字串了,可是旗幟呢? 那代表你所得到的 m
不正確。這很大機會是因為你所得到的數字還不等於 ,而是 的一個(很小的)倍數。你可以獲取更多的 來計算最大公倍數,從而算出一個正確的 。
can_leave
不是0。 (但看完源碼以後總覺得can_leave
一定是0?)scanf("%s", buf)
不會去限制使用者輸入的字數,令程式弱於Buffer overflow attack
。printf(buf)
看上去很奇怪,因為通常在c語言中打印字串會是printf("%s", buf)
。Format string attack
攻擊程式。Format string attack
可以達到任意內存讀取
和任意內存寫入
的效果.Checksec
以檢查程式開啟的保護。get_shell
函數的內存地址是隨機的。Buffer overflow attack
是行不通的。Format string attack
去洩露一個PIE地址(指一個受PIE影響到地址),然後計算出get_shell
函數的內存地址。 (洩露出來的地址跟get_shell
函數地址之間的差是固定的)Format string attack
去洩露canary的值。Format string attack
去覆蓋can_leave
的值,因此程式可以離開while循環以及main函數 (以觸發Buffer overflow attack
)。Buffer overflow attack
去覆蓋main函數‘返回地址’的值到get_shell
函數的地址。get_shell
函數去獲取shell和cat旗幟。可以用好多方法黎做呢條題目, 但係最簡單就應該係睇隻game既 network traffic黎感覺下佢入面到底係做緊咩.
我地可以setup 一個proxy 黎偷睇中間既所有traffic, 甚至可以用黎改入面既內容.
件事係, 你setup 一個係game server 問埋中間既proxy server, game client 就連去個proxy, proxy就連過去game server. 咁個proxy就可以睇曬兩邊傳送出黎既data, 又或者send 俾對面之前改左個內容佢.
你可以用求其一個proxy/mitm工具黎做, 如果係HTTP request 既話, 你可以用mitmproxy
, 但係依家用TCP proxy會好d (因為mitmproxy
會好難setup non TLS traffic)
其中一個TCP proxy 會係 tcpproxy.
setup 類似係咁:
咁你就可以直接用chess client 黎connect去個proxy:
係proxy 果邊就會睇到啲traffic data, 你會睇到個client send 啲咩俾server, server 又回應啲咩俾個client.
你都可以用tcpproxy
黎改啲traffic data, 好似咁
想知點config 就上github睇下佢地啲source code
你試下改唔同既野就可能會發現唔係下下改咩都會得. 要點改先會唔炒? (可能關於頭果幾古怪bytes?)
依家你應該可以用改野黎出到千. 祝你好運!
下載 sdcard.zip
, 解壓縮並找到 sdcard.dd
. 把它放入數位鑑識工具當中。
在以下的 writeup 中,我將使用 Autopsy 作爲示範。你應找到在 $CarvedFiles
之中找到 f0000000.png
。
Autopsy 亦提供副檔名的搜尋功能。使用此方法則會找到 _lag.png
。
f0000000.png
與 _lag.png
爲同一照片。我匯出 f0000000.png
並繼續進行調查。
若你不打算使用 Autopsy 並使用其他工具,照片名稱可能會有差異。
我們直接打開照片但沒有看到什麼。
同時可交換圖檔格式中的資料亦與檔案大小不符。
我們可以在以下方向繼續調查:
由於檔案副檔名爲 PNG, 我們決定以修復損壞照片作爲調查方向。 你可以在下方閱讀更多有關 PNG 數據塊結構的資料:
PNG © corkami, CC BY-NC-SA 2.0
我們決定將 f0000000.png
放入 PNG file chunk inspector。發現有多個 IHDR 數據塊結構。
可是一個正常的 PNG 檔案只有一個 IHDR 數據塊。我們可以使用任意的十六進位編輯器修正照片 f0000000.png
。
我使用 HexEd.it 修正照片。你亦可使用 HxD 修正。
在 PNG file chunk inspector 中我們得知我們可以移除以下其中之一的 IHDR 數據塊:
第一個 IHDR 數據塊 (位元 8 - 32) 顯示照片只有 1 像素。這個數據塊令人生疑,所以我們先嘗試把它去除。一個 IHDR 數據塊應爲 25 位元。
當你祓除第一個 IHDR 數據塊後,儲存照片並嘗試把它打開。你現在應該可以正常地瀏覽 PNG 照片。
以下只是旗幟的一部分。現在嘗試自行解一次題吧!