【攻防世界015】notsequence
關鍵詞:嵌套循環,楊輝三角。
這個題是32位ELF,先看主函數:
初始化了一個全局數組,我給它命名為 DwordArray ,因為根據后面對它的尋址可以知道這是一個4字節數組。然后循環 scanf 讀取整數,直到讀取到0為止。
接下來調用 Check1 ,參數是 DwordArray:
檢查 Check1 的返回值,等于 -1 就表示輸入錯誤,繼續看下面的代碼,發現必須返回 20 才行:
Check1 必須返回 20,后面還有一個 Check2 函數,但是說實話其實可以不用看了,把 Check1 分析明白了基本就能猜出密鑰。接下來分析 Check1。
Check1 長這樣,有嵌套循環,這種函數比較復雜,我做題的時候是一邊逆向一邊還原成C代碼的,還原后用F5檢查,如果基本一致就沒問題了,如果有不一致的,就要仔細檢查是代碼還原有錯還是F5的錯。
外層循環了 0x400 次。
這是內層循環,觀察 DwordArray 的尋址,有乘以4表示元素大小是4字節,下面給出我還原的代碼:
基本上大同小異,接下來要看看能從 Check1 獲取到什么信息。外層循環,每次循環對 result 加 1,最后返回時必須等于 20,我們寫腳本的時候,要看看 result 什么時候等于 20。i 和 j 的值我們寫腳本的時候是知道的,但是 DwordArray 的值不知道,所以只能假設。我們可以對照著還原的代碼,寫出這樣一個腳本:
def Check1():result = 0 # 返回時必須等于20i = 0while i <= 1024:var_10 = 0j = 0if result == 20:print("現在 result %d 等于 20,如果 DwordArray[%d] 等于0,就可以正確返回 20" % (result, i))returnelse:print("現在 result %d 不等于 20" % (result))while j <= result:# 注意 這一步還沒做print("var_10 += DwordArray[%d]" % (i + j))j += 1print("var_10 必須等于 ", 1 << result)result += 1i = (result + 1) * result / 2print("---------------------------------------")Check1()我們從 Check1 能夠獲取的信息就是這些了,我們知道第0個元素是1,第一和第二個元素求和等于2,而它們不能是0,所以只能是兩個1,然后3到5這3個元素求和是4,這個組合就無法確定了,可能是 1 1 2,1 2 1,2 1 1 。如果是 1 2 1 的話,感覺就很像楊輝三角了,楊輝三角每行的求和就是2的行數次方,所以大膽猜測密鑰就是楊輝三角。下面只需要寫一個腳本打印楊輝三角前20行的值就行了。
# 打印20層楊輝三角 def yanghui():n = 20m = 20arr = [[0 for i in range(n)] for j in range(m)]for i in range(20):for j in range(20):if j == 0 or i == j:arr[i][j] = 1for i in range(20)[1:]:for j in range(20)[1:]:arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]for i in range(20):for j in range(20):if arr[i][j] != 0:print(arr[i][j], end="")yanghui()1111211331146411510105116152015611721353521711828567056288119368412612684369111045120210252210120451011115516533046246233016555111112662204957929247924952206612111378286715128717161716128771528678131114913641001200230033432300320021001364911411151054551365300350056435643550053003136545510515111612056018204368800811440128701144080084368182056012016111713668023806188123761944824310243101944812376618823806801361711181538163060856818564318244375848620437583182418564856830608161531811191719693876116282713250388755829237892378755825038827132116283876969171191
把這一長串拿去做md5,就能得到flag。提交發現是正確的,所以 Check2 就不用看了。
但實際做題的時候我一開始沒猜到是楊輝三角,我把 Check2 也還原了,也是嵌套循環:
說實話還原完 Check1 和 Check2 我還是一臉懵逼,我做這題完全是靠猜的。但是問題不大,主要鍛煉的還是逆向分析的能力嘛。。。
總結
以上是生活随笔為你收集整理的【攻防世界015】notsequence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【攻防世界014】tt3441810
- 下一篇: 【攻防世界016】re2-cpp-is-