2020數字中國創新大賽虎符網絡安全賽RE——game WP

閱讀字節碼後,首先定義了三個列表,arr0,arr1,arr2。
主函數邏輯大致如下(僞代碼形式給出):
獲取輸入,然後依次調用4個check函數對輸入進行check,如果其中任何一個不通過,返回失敗。
在這裏插入圖片描述分別查閱4個check函數。4個函數翻譯過後,整理出其關鍵運算處(用僞代碼形式),推測出其作用。
check0:字符ASCII值必須在32~127即可打印字符
check1:長度校驗,可以爆破得flag長度
check2:檢查輸入格式是否爲flag{xxxx},並且這裏可以爆破得到第一個字符5
check3:核心檢驗算法
在這裏插入圖片描述
check3函數分別將輸入分出三個部分進行不同運算校驗,需要針對三個部分進行逆向,最後對逆向出的三部分字符進行合理組合,獲得最終flag.

arr0 = [249, 91, 149, 113, 16, 91, 53, 41]
arr1 = [43, 1, 6, 69, 20, 62, 6, 44, 24, 113, 6, 35, 0, 3, 6, 44, 20, 22, 127, 60]
arr2 = [90, 100, 87, 109, 86, 108, 86, 105, 90, 104, 88, 102]

# 獲取flag長度
length = 0
for i in range(100):
    if ((i * i) % 777) ^ 233 == 513:
        length = i
# print(length)

flag = list(range(length))  # len = 39
flag[0] = 'f'
flag[1] = 'l'
flag[2] = 'a'
flag[3] = 'g'
flag[4] = '{'
flag[-1] = '}'

#獲取第6個字符
for j in range(256):
    if ((((ord(flag[0]) * 128 + ord(flag[1])) *128 + ord(flag[2])) *128 + ord(flag[3])) *128 + ord(flag[4])) *128 + j  == 3533889469877:
        flag[5] = chr(j)
        print(chr(j))
#print(flag)

# 第一部分
a = ''
for i in range(8):
    for j in range(256):
        if ((j * 17684 + 372511) % 257 == arr0[i]):
            a += chr(j)
            flag[6 + i * 3] = chr(j)
print(a)
# print(flag)

# 第二部分
b = list(range(4))
for i in range(4):
    for j in range(256):
        if j ^ ord(flag[12 + i * 3]) == arr1[5 + i * 3]:
            b[(1 + i * 3) % 4] = j
print(b)
flag[-2] = chr(b[0])
flag[-3] = chr(b[1])
flag[-4] = chr(b[2])
flag[-5] = chr(b[3])
#print(flag)

b = b * 5
c = ""
for i in range(len(b)):
    for j in range(256):
        if b[i] ^ j == arr1[i]:
            flag[7 + i] = chr(j)
            c += chr(j)
print(c)
#print(flag)

#第三部分   我用Python3跑不出,,最後用同樣的判斷條件C++跑出來了,不知道爲什麼。
flag[28] = '1'
flag[29] = '5'
flag[30] = '4'
flag[31] = '1'
flag[32] = 'p'
flag[33] = 'N'

for ch in flag:
    print(ch, end='')

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
	vector<int>arr2{ 90, 100, 87, 109, 86, 108, 86, 105, 90, 104, 88, 102 };
	
	
	string d;
	int p = 0;
	for (int i = 0; i < 6; ++i)
	{
		for (int j = 0; j < 128; ++j)
		{
			if ((((j + 107) / 16) + 77) == arr2[p] && ((j + 117) % 16) + 99 == arr2[p + 1])
				d.push_back((char)j);
		}
		p += 2;
	 }
	cout << d << endl;	

	return EXIT_SUCCESS;
}

在這裏插入圖片描述

flag{5LZG50ex5Yi75VqE5YePLIK1541pNu3Fq}

看了官方WP發現,我把最後四個字符弄反了…難怪一直提交不對,無語。還有就是第三部分的flag字符,我用Python3一直跑不出,我一懷疑是不是我條件看錯了,反覆校驗發現沒問題,於是用C++跑了下,出來了,無語。但官方用Python2能跑出,不是很明白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章