CTF 兩道web整數溢位題目(貓咪銀行和ltshop)
①貓咪銀行: (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