1. 程式人生 > >CTF 兩道web整數溢出題目(貓咪銀行和ltshop)

CTF 兩道web整數溢出題目(貓咪銀行和ltshop)

code 過去 而是 也不能 競爭 ack 腳本 十個 一分鐘

①貓咪銀行: (2018中科大hackgame)

技術分享圖片

一開始給十個CTB,而flag需要20個CTB,我們需要理財賺夠20個。  
理財是只能買入TDSU才可以獲得收益。我們先上來直接把CTB全部換成TDSU。  

技術分享圖片

上邊是我們花了所有TDSU:66060買了19分鐘後的收益。(因為一個賬號最多存在20分鐘,計算你用腳本極限也不能買20分鐘,必須留一分鐘用來換TDSU和買入,取出等操作)  
還是不行,算上收益的錢1200231也不夠買20個CTB。  

考慮買RMX是否存在匯率差。

發現一個CTB57個RMX,一個RMX值115TDSU,也就是一個CTB值6555個TDSU,還不如直接買。  

只能考慮另外的情況:

整形溢出

在買入份額上輸入很大的數或者負數,都會有錯誤提示,交易失敗。此處不存在整形溢出。  
再買入時間上輸入很大的數  

技術分享圖片

成功溢出。仔細觀察這個值,會發現。

技術分享圖片

是int64類型的溢出。

直接購買9223372036854775808時間,份額為1000,收益仍為負數。嘗試將時間慢慢調小。  
9123372036854775808(第二位2改為了1)成功讓世間變為負的,且收益為正.(跳不出來慢慢調,後邊寫下原理)  

技術分享圖片

時間為負的直接去出來就好了,然後兌換flag。

②LTshop(護網杯)

前邊的條件競爭不說了,開個burp多線程買幾個大辣條,買4個就好了,為啥起碼4個,後邊有介紹。

其實看到最後的9999999999.......個大辣條換flag也能猜到是溢出。

這裏存在uint64整數溢出。  
2^64-1為最大值:18446744073709551615  

這裏如果我們直接輸入18446744073709551615,服務器端肯定會先給你 *5,為啥呢?

因為判斷你大辣條的數目啊,一個辣條之王得用5個大辣條來換啊,所以溢出過大了,而我們的要求是正好溢出一點點,所以說除以5=3689348814741910323。

這個時候輸入3689348814741910323,服務端 *5=18446744073709551615,雖然表面上是18446744073709551615,實際上為0。

所以我們稍微加1,輸入3689348814741910324,* 5=18446744073709551620,實際上服務端以為我們只買4個大辣條。所以成功購買那麽多大辣條。

總結的問題

①uint64溢出範圍0-18446744073709551615(沒有負數喲)

②為什麽非要買4個大辣條,你輸入的數據乘以五後是18446744073709551620。

溢出界限(最大數)是18446744073709551615,也就是說這個數字還沒有溢出,一旦加1,就變成了0,也就是說18446744073709551616代表0,以此類推18446744073709551620代表4  

③這兩個題目溢出類型不一樣:

貓咪銀行是int64,存在負數,所以構造的時候錢數有可能是負數,所以你得自己計算收益(和買入時間和買入份額有關系。)  
ltshop沒有負數,不然的話18446744073709551615+1=18446744073709551616實際上代表了-18446744073709551616你得再加上18446744073709551617=36893488147419103233才能代表買一個大辣條。  

④關於ltshop為什麽是uint64溢出,我也不知道啊,涼了啊。
別人的wp上邊是看的cookie,知道了框架,然後才知道的溢出類型,如果你實在不知道什麽溢出類型,那你就把這幾個溢出類型挨個試一下。

⑤貓咪銀行那到題目不是隨便買的,而是猜的。

雖然9223372036854775807是最大數,但是你的收益和時間才是最終決定你溢出是否成功的條件。我們得想個辦法讓你的收益溢出的時候為較大的正數並且滿足時間為過去的時間,或者取出時間在20分鐘之內。所以我們輸入的數要先讓他達到溢出的臨界值。

然後讓這兩個數在-9223372036854775808到9223372036854775807之間達到我們想要的,計算的話太麻煩了,不如直接猜,每次一個範圍一個範圍的測試就好了。

好像太大了也不行,會出問題,比如我一開始輸入很大的數,怎麽調都是-9223372036854775808

CTF 兩道web整數溢出題目(貓咪銀行和ltshop)