前情提要:
https://www.toutiao.com/i6800255609745703427/
https://www.toutiao.com/i6800564683771216387/
0x08
題目給的提示是和運算符優先級有關
登錄後直接看源碼
看關鍵:
main調用的xor函數:
將長度給len的字符串與1異或
main中的主要邏輯
從/home/mistake/password讀10個字節數據放到pw_buf,我們手動輸入10字節數據放在pw_buf2,如果pw_buf2與1異或的結果如果與pw_buf相等,則打印flag
那麼關鍵就是pw_buf的數據,先直接讀password看看
沒有權限
題目的提示是和運算符優先級有關
我們仔細分析源碼,看看問題出在哪裡
問題在這裡
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
open函數里權限檢查是沒問題的,O_RDONLY表示以只讀方式打開
0400表示文件所有者具有可讀取的權限
由於權限通過檢查,所以open函數返回值為0
有因為0<0不成立
所有比較結果為0
然後賦值給fd
即fd為0,表示標準輸入,也就是說fd現在是我們可控的
結合之前分析,pw_buf也為我們控制
那就很簡單了
第一次輸入10個1,存入pw_buf
第二次輸入10個0,存入pw_buf2,與1異或後覆蓋pw_buf2,此時buf2的值也為10個1,滿足打印flag的邏輯
0x09shellshock
查看權限
可以看到shellshock程序的所屬組的權限位上有s,表示sgid,也就是說在執行shellshock時,用戶將獲得shellshcok所屬組的權限,即執行shellshock後將獲得root所在用戶組的權限,而由flag這一行的權限位可知,該權限可以讀取flag
這一點從源碼中也可以看出來
getegid()返回進程執行有效組識別碼。在這裡getegid()返回的就是root所在用戶組的id
setresuid用於設置ruid,euid,seuid,在這裡就是統統都設置為進程當前的egid
setresgid用於設置rgid,egid,sgid,這裡也是統統設置為進程當前的egid
因為s標誌,所以egid實際上是root所在用戶組的id
再根據題目提示的shellshock
這是著名的bash破殼漏洞
直接在網上找到poc修改下即可
解釋一下發生了什麼
首先在當前環境下定義了X函數,函數體由{}括起來,然後在函數體外加了一條額外的語句/bin/cat ./flag即打印flag的命令,這條語句會在後面執行./shellshock時被調用,由於執行shellshock時會有root權限,所以自然就有權限來打印flag了
0x10
按照要求連接服務器
這是一個小遊戲
大意是一堆貨幣裡有真幣假幣,兩者重量不同,真幣10g,假幣9g。給你N個硬幣,C次機會,讓你猜哪一個是假幣。需要在30s的時間裡才對100次。
這題其實考的是算法。
分治法解決
舉個例子。
一共100個硬幣,其中1個是假的,先稱重1-49,如果結果整除10,則假幣在50-100.
第二輪稱50-75,如果不整除10,則假幣在其中
第三輪稱50-62.。。。。
其實就是簡單的二分法
編程
以上一關的shellshock登錄服務器,在tmp目錄下新建一個python 腳本
按照提示
用pwntools編寫的時候,注意remote(‘0’,9007)
執行如下
0x11blackjack
em
源碼有點長,直接看關鍵部分
這裡會校驗我們輸入的金額
如果比cash大則會報錯,並要求再次輸入
不過再次輸入的時候不會報錯了
考慮到要賺夠1000000,而輸的幾率比較大
我們可以輸入-的金額,比如-1000000,只要輸了就可以拿到flag
然後選擇y就打印出flag了
聲明:筆者初衷用於分享與普及網絡知識,若讀者因此作出任何危害網絡安全行為後果自負,與合天智匯及原作者無關!
閱讀更多 合天網安實驗室 的文章