阅读字节码后,首先定义了三个列表,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能跑出,不是很明白。