超神之路之PWN訓練之1之fd

2021-08-11 22:10:27 字數 1339 閱讀 9566

環境搭建:拷的學長的ubuntu虛擬機器,直接拿過來用了。

訓練**為

點開fd,可以看到需通過ssh連線到遠端終端做題,命令如下:ssh [email protected] -p2222,密碼:guest,連線好以後如下圖。

通過ls命令可以看到有三個檔案,再用ls -al檢視檔案許可權,發現fd和fd.c檔案都只有讀的許可權,fd為fd.c編譯出來的c程式,而flag則是要執行的奪旗程式,但我們沒有許可權執行,需通過執行fd+引數來執行。

接下來看fd.c的**,執行命令cat fd.c

可以看到,要執行flag程式得到flag,必須使buf的值為「letmewin\n」,而buf的值是通過read()函式從定義的fd複製來的。而fd的值就是傳輸給程式fd的引數轉化為int值後再減去0x1234得來的。那麼問題來了,最後得到fd的值為乙個整型,複製給fd的也是乙個整型,在if語句中整型和字串比較是無論如何無法匹配的,那麼該怎麼通過if得到flag呢?

這個時候就需要知道乙個點,read()函式的第乙個引數是可以設定為某些特殊引數的,如下

當fd為0時,要複製給buf的值就可以從鍵盤輸入,bingo。

現在只要通過輸入給程式fd的值來使引數fd=0,就可以再通過鍵盤輸入「letmewin\n」來進入if語句奪旗。

注意一點,atoi()函式是將字串轉化為十進位制的字串整型,與0x1234減的時候會先轉化為16進製制,所以需先將引數轉為10進製再輸入,0x1234的十進位制為4660,故輸入命令./fd 4660後再輸入"letmewin\n" 就可以獲得flag。

擴充套件:當輸入值為4661和4662時,也能通過鍵盤輸入"letmewin"來獲得flag。

原因是輸入4661和4662,相應的fd值為1和2,對應了上表的standard output和standard error。standard output是讓你鍵入你想要程式輸出的值,standard error是鍵入程式出錯時顯示的異常值,而無論是設定的哪個值都會把鍵入值複製給buf,故輸入4660-4662都能奪旗。

CTF攻防練習之綜合訓練1

主機 192.168.32.152 靶機 192.168.32.166 首先使用nmap,nikto host dirb掃瞄,探測靶場 開放了 21,22,80d埠已經發現有一下關鍵資訊 進入login登入介面 檢視源 發現一段php函式,審計這段 過濾了 很有可能存在sql注入,且需要構造使用者名...

HDU 4370 0 or 1 最短路(神之轉換)

題目鏈結 題目大意 給乙個n n的矩陣,讓你自己找乙個矩陣 矩陣的數非1即0 並求出 c ij x ij 1 i,j n 的最小值 剛開始在最短路的知識部分接觸到這個題根本沒有頭緒,而且也沒注意到所求矩陣的特點 非0即1,很重要 下面分析一下所要求矩陣的三個特點 我們可以把行理解為圖中出度,列理解為...

PHP小白之路1 PHP之簡易留言板設計

介面展示 搜尋頁面展示 目錄結構如下 資料庫表 如下 message.php 搜尋 messagedb.php include mysqli.php page isset get page get page 1 page get page num get num startnum page 1 nu...