写在前面
在现场,眼看着Nep靠着Re和Cry AK 在神仙局杀进前六
但是和我并没有什么关系,因为虽然也在打,但一道题都没出,甚至干出了把VMP看成控制流混淆的蠢事。
于是乎,赛后补补脑子——
Reverse
ez_rust
die打开发现rustc的文件目录
不过细看还有个更让人在意的东西,这个tauri又是个啥玩意?
一查发现了一个跟我们碰到的程序图标相同的Rust框架。我们注意到它还可以调用js,那说不定从这个压缩出的exe里还可以提出些别的什么。于是我们直接提提,提提提(
提取方法参考yllhwa的文章和Medium上Felix Alexander的文章,我们可以通过程序里内显的关键字,或者直接搜索文件名找到index.html
、tauri.svg
之类的固有文件名,拿到所有的数据表及其相关的地址,然后再brotli解压缩。
虽然但是,由于tauri 1.5.4对数据结构采用了一种新的优化方式,个人理解可能会让ida产生一些不必要的误会,导致现在查找这些数据可能得费点功夫,详情可见华章出版社的文章。但实际上,如果你能翻找到数据集的开头,还是用肉眼可以强行把数据给翻出来的(虽然很费劲就是了)——
由于IDA里并没有看出什么可能有rust库的成分,因此本体的逆向基本可以忽略。综上,不管你是直接找数据表,还是从数据溯源回数据表,我们直接把在这个数据表里两个特别显眼的文件,一个html,一个js给捞出来——
import brotli
content = open("ez_rust.exe", "rb+")
content.seek(0x37022f + 0x0B) # 注意以die之类的二进制查看器找到的实际地址为准(实在不行挨个试一遍
html = content.read(0xE7) # 至于数据和长度,程序内部都给好了,照着填就行
content.seek(0x370321 + 0x19)
js = content.read(0x5569)
decompressed = brotli.decompress(html) # brotli解压
open("index.html", "wb").write(decompressed)
decompressed = brotli.decompress(js)
open("index-tWBcqYh-.js", "wb").write(decompressed)
content.close()
html里面除了样式没东西,我们直接看js(随便找一个美化器美化一下就可),然后搜索页面里面出现的内容,再顺手调到函数里头,主要逻辑是这一块:
function s(o, i = "secret") {
for (var c = "", u = i.length, d = 0; d < o.length; d++) {
var h = o.charCodeAt(d),
x = i.charCodeAt(d % u),
w = h ^ x;
c += String.fromCharCode(w)
}
return c
}
async function r() {
if (n.value === "") {
t.value = "Please enter a name.";
return
}
btoa(s(n.value)) === "JFYvMVU5QDoNQjomJlBULSQaCihTAFY=" ? t.value = "Great, you got the flag!" : t.value = "No, that's not my name."
}
非常简单异或加密,随便写个py意思意思:
from base64 import b64decode
ans = b64decode(b'JFYvMVU5QDoNQjomJlBULSQaCihTAFY=')
key = b'secret'
flag = ''
for i in range(len(ans)):
flag += chr(ans[i] ^ key[i % len(key)])
print('L3HCTF{' + flag + '}')
L3HCTF{W3LC0M3_n0_RU57_AnyM0r3}
Dictionary Compression
这贵物的回显上来就报错:
PS D:\比赛\L3HCTF2024\Reverse\Dictionary Compression> ./main.exe
Error: Os { code: 2, kind: NotFound, message: "系统找不到指定的文件。" }
die里看到这玩意是Rust,更慌了。别急,它还下发了一个output,虽然里面只有一串⭐意义不明⭐的字符,但是还是能够借助文件名定位到一个奇怪的函数:
在此之前程序加了大量的0x48用来jump +$2
花指令迷惑IDA,手动去掉即可(虽然后面发现从main函数也能直通)。这里面也标明了“指定文件”就是flag.txt
,以及输入位数大概是31左右(因为只有这一个比较明显的常量)。不过更让人在意的是上面那一段,为什么就特定对这三个字母switch case。这时候,看看output,再看看回显:
忽然发觉,如果靠硬蒙,那最后应该是用这三个字母组成输入,要让程序的输出,或者output产生的结果跟下发output一致了。前8位二进制还好说,经过几次运行检查,就是回显的二进制串的长度,但后面未知。那么问题来了,硬爆31位字符串,就算只有三个字母也太大了,用什么办法呢?
找规律呗:
横向对比同一字符变化:
“abcabc”对应1BE3579A04
“abcaba”对应1BE357AC02
“abcabb”对应1AE357AD02
;纵向对比变化位置改变时(二进制数值仅供参考):
“abcabc”对应1BE3579A04
(11100011,01010,11110,0110,10100)
“abcaba”对应1BE357AC02
(11100011,01010,1111,0101,10010)
“abcaac”对应1BE356DD07
(11100011,01010,11011,0111,01111)
“abcbbc”对应1BE34D6B01
(11100011,01001,10101,1010,11001)
“abaabc”对应1AE24F3500
。
不难发现,同一字符变化,后输入的字符至少会使得输出的某处对应字节受到影响;变化位置前移,受到影响的起始位置也前移。结合来看,输入末尾第1个字符变化影响输出末尾两个字节,第2或3个字符影响三个字节,第4个字符影响4个字节。
但要是从二进制位来看就更明显了,根据回显数值来看,组成二进制输出以5个二进制位为一组,对应着某些输入位数,一位输入的变化明显导致对应其对应组、前一组和后一组的二进制数值发生变化。也就是说,本质上而言,这个问题其实是深度为2的动态规划,只有n和n-1对n+1有影响?(见S1uM4i的题解
但我在打OI的时候就弄不清动态规划,怎么办?Nep的师傅倒是给出一个暴力思路,既然综上所述,那么在前面所有位数已知的前提下,会对最终结果造成影响的只有后三位,也就是说,我们只要每一次爆五去三,把后三位扬了,最后高低能弄出来点东西。
以下是本人在看了好几遍Nep的暴力代码后生出的产物:
import os
import itertools
brute_list = ["".join(i) for i in itertools.product('abc', repeat=5)] # itertools,非常好暴力插件,使我的全排列旋转
origin_output = "111010110011111010100110100011001110100100010011111110110110100111100110001111001101010011011011010110111110101001001101101101010100110110111010"
def cmp(out): # 比较当前答案与标答
correct_len = 0
out_len = out[0]
out_bin = ''
for i in range(1, len(out)):
out_bin += bin(out[i])[2:].rjust(8, '0') # 传进来是以字节形式,所以要按字节大小补全
out_bin = out_bin[0:out_len]
for correct_len in range(len(out_bin)):
if origin_output[correct_len] != out_bin[correct_len]:
break
return correct_len
def brute(Input):
file_flag = open("flag.txt", "wb")
file_flag.write(Input.encode())
file_flag.close()
os.system("main.exe > rubbish.txt") # 暴力执行程序以求得当前遍历值结果
now_output = open("output", "rb")
output_data = now_output.read()
now_output.close()
same_len = cmp(output_data)
return same_len
ans = ""
current_len = 0
while current_len <= len(origin_output):
r = [0 for _ in range(len(brute_list))]
maxtag = 0
maxval = 0
for c in range(len(brute_list)): # 暴力枚举每一个可能的情况并记录最大匹配长度
r[c] = brute(ans + brute_list[c])
if r[c] > maxval:
maxtag = c
maxval = max(maxval, r[c])
current_len = maxval
ans += brute_list[maxtag] # 将匹配结果存储
ans = ans[:-3]
print(ans, current_len)
爆的位数差不多了就可以开始手动暴力最后一两位了。
L3HCTF{bbccaacbcacbacbaaabcacbaaabcccaaaabbaaab}(应该
DAG
上来只给一个bytecode,事出反常必有妖。
进去看到IMPORT_NAME,发现是python的bytecode的可视化形式,没办法直接用,遂接受Nep佬Musicat的建议,直接喂AI……好吧,我实在没有那种劲爆AI,免费版不是被干宕机就是根本吞不下去。唯一的办法就是手搓汇编,但是那样太废工了,索性拿官解的成品看看,正常来讲你会得到下面这个东西——
import random
def func1(lss, i, j):
if arr[i*len(lss)+j] != -1:
return arr[i*len(lss)+j]
s1, s2 = list(lss[i]), list(lss[j])
l1, l2 = len(s1), len(s2)
flag = True
n = 0
if l1 - l2 == 1:
for m in range(l1):
if s1[m] != s2[n]:
if flag:
flag = False
else:
arr[i * len(lss) + j] = 0
return arr[i * len(lss) + j]
else:
n += 1
if n == l2:
break
else:
arr[i*len(lss)+j] = 0
return arr[i * len(lss) + j]
arr[i * len(lss) + j] = 1
return 1
def abc(lss, i):
if abcarray[i] > 0:
return abcarray[i]
m = 1
for index, word in enumerate(lss):
# if i == index:
# print('warning!')
if func1(lss, i, index) == 1:
m = max(m, abc(lss, index) + 1)
abcarray[i] = m
return m
def solution(lss):
global abcarray
abcarray = [-1] * len(lss)
global arr
arr = [-1] * (len(lss) * len(lss))
ans = 1
for i in range(len(lss)):
ans = max(ans, abc(lss, i))
return ans
def func2(n):
a, b = 1, 1
for i in range(n - 1):
a, b = b, a + b
return a
def calc(nums):
num1, num2, num3 = nums[0], nums[1], nums[2]
num1 = 2023 + (num1 & 0xf) - (num1 & 0xf0)
num2 = func2(num2 + 7)
random.seed(num3)
flag = f"{num1}{num2}{num3}{random.gauss(num2, 0.2)}"
flag = flag.replace(".", "x")
print('flag=', flag)
return flag
def encode(s):
ret = []
ls = list(s)
for i in range(0, len(ls), 2):
num1 = ord(ls[i])
num2 = ord(ls[i+1])
numa = (num1 & 0xf8)>>3
numb = ((num1 & 0x7)<<3) | ((num2 & 0xf0)>>4)
numc = num2 & 0xf
ret = ret + [numa, numb, numc]
return ret
if __name__ == "__main__":
num1 =
num2 =
num3 =
str1 =
str2 =
str3 =
str4 =
str5 =
str6 =
str7 =
str8 =
assert encode(str1) == [12, 22, 1]
assert encode(str2) == [12, 14, 2]
assert encode(str3) == [12, 22, 3]
assert encode(str4) == [12, 30, 2]
assert encode(str5) == [12, 22, 4, 12, 30, 1]
assert encode(str6) == [12, 22, 1, 12, 30, 4]
assert encode(str7) == [12, 22, 2, 12, 22, 2]
assert encode(str8) == [12, 14, 3, 12, 38, 2]
assert num1 == solution(["a", str1, str2, str3, str4, "bda", str5, str6, str7, str8, "bcdef", "aabcc", "acbac", "bdcaa", "bbbbcc", "babccc", "abaccc"])
assert num2 == solution(["klmnowx","abcdefgiklmno","fgij","bcfghijklmno","fgjpqrst","uy","abceklmnouvw","pqrstuwy","fghijlno","mnouvwxy","klmnopqt","klmnopqrstuy","aeuvw","muvw","abcdeklmnow","fhijpqrst","mpqrst","klmnoprt","fghijklno","abcdelmo","klnuvwxy","klmnopst","abcdeklmnov","fghj","luvwxy","ghklmnopqrst","pqrstwx","abcdklmno","cdefghij","pqrs","efghijklmno","fghjklmno","adeklmno","rs","kuvwxy","ghij","befghijklmno","ln","hijklmnopqrst","ghpqrst","fgiklmnopqrst","pqrtuvwxy","pqrsty","jklmnopqrst","lnouvwxy","klmnoqsuvwxy","abcdeghklmno","fi","fghijlnpqrst","abdklmnouvw","uwx","abcdekln","klmno","abcdekn","abcdemuvw","pqs","fghijpqt","klmnopqrstuw","n","nopqrstuvwxy","abcdefghj","fghiklmnopqrst","klmnorst","abcdemnouvw","fgh","pqt","abfghij","o","nouvw","abcdklmnouvw","abeklmno","abcden","klmnopqrstwxy","q","fghijklmnoprt","klmnovx","abceuvw","klmnopsuvwxy","hj","abcdefgh","fhjklmno","klmnoquvwxy","wxy","klmnopqrstuvwy","kln","abcdegklmno","mno","gklmno","klnouvw","fghijklmnoqr","fghijpqrst","mnuvwxy","ghipqrst","klmnoqrtuvwxy","acdfghij","uwy","fghjklmnopqrst","mnpqrstuvwxy","abcdeknouvw","abcdefghijklmno","klmnorsuvwxy","abcdeh","klmnost","iklmnopqrst","abcdegijklmno","fghijklmopqrst","fghijklmnors","pqrstux","abcdefghijlm","abcdem","klmn","opqrst","ghjklmnopqrst","cdfghij","kluvwxy","ceklmno","abcdeghijklmno","lmo","bklmno","fghijs","cdeklmnouvw","abcdeknuvw","cdklmnouvw","abcdeklmnovw","klmnopr","fghijklmnopqrst","klmnopqtuvwxy","abcdefhijklmno","abcdeuv","abcdefhklmno","x","abcdeouvw","fjklmno","a","klmnopqrstuv","abdklmno","fghijlm","bcefghijklmno","quvwxy","fghi","klmnopqrstuwx","r","klmnuvw","kn","abcdeklmn","abcdeklmno","ps","klmnoqrt","pstuvwxy","klmnopqrsty","lmn","d","abcdefghijmo","fghijmnopqrst","ghiklmno","mouvwxy","abcdeghj","fghijklmnopr","kmnouvwxy","fghijklmnopqst","klmnox","nouvwxy","adefghijklmno","kmo","klmnovy","klmnopqrstuvwxy","cde","y","klmnouy","fgklmnopqrst","nuvwxy","kluvw","abcdefghijkno","abcdekl","fghijno","ceuvw","abcdelo","bcdklmno","gij","abcdeijklmno","klmnopqrt","abcdeklm","pqruvwxy","klnuvw","fijklmno","knpqrstuvwxy","fghijklmnor","ace","abcdekluvw","deklmnouvw","lpqrstuvwxy","abcdefhiklmno","fijpqrst","klmnopqrstvwy","mn","kmpqrst","ipqrst","fghijkmnpqrst","uvxy","bklmnouvw","fghijkmnopqrst","fghijklnopqrst","kopqrstuvwxy","pqrstuwxy","abdeuvw","acefghij","jklmno","k","fghijqs","abcdefghijno","fghijklmnort","adeuvw","vwx","gjklmno","hi","abcdefghijm","nuvw","fklmnopqrst","abcdehklmno","fghijklmnoqrt","klmnoruvwxy","abcdemnuvw","klmnovw","klmnopqrstvw","klmnoqtuvwxy","klmnoy","wx","ouvwxy","lmopqrst","fghjpqrst","lnuvwxy","vy","abdfghijklmno","kmnouvw","uvy","klmnoqst","klmnort","pqrstuxy","qs","lopqrstuvwxy","mnouvw","abdeklmno","abcdelnouvw","pruvwxy","qrsuvwxy","cklmno","bc","acdfghijklmno","j","fghijpqs","fghijknopqrst","fgijklmno","fghijnopqrst","mpqrstuvwxy","knopqrst","acdeuvw","lnouvw","fghijklmn","klmnouvxy","abcdefghiklmno","abcdefghij","hij","abcdekuvw","klmnopqs","aklmnouvw","acdefghijklmno","cfghij","fghijpqst","cfghijklmno","abcdefhi","kmouvwxy","pquvwxy","pqrstuy","pqrstuwx","ce","klmnopqrstv","deklmno","klmnouvw","abcdeno","fghijkmo","knouvwxy","fpqrst","hklmno","fghijkmopqrst","abcdefghjklmno","kmpqrstuvwxy","dklmnouvw","abcdefghijkmo","abcdel","giklmnopqrst","buvw","klmo","klmnoqrsuvwxy","uvwy","abcdeluvw","klmnostuvwxy","bceklmno","fghijm","defghijklmno","ijklmno","pqr","abcduvw","fghijklmnopqt","hijklmno","klmnoprsuvwxy","aeklmno","lo","klmnouxy","cdklmno","fghijpr","muvwxy","lmnouvwxy","abce","kmnopqrst","pt","klmnoptuvwxy","abde","abcdeghiklmno","klmnopqsuvwxy","klmnouvx","efghij","klmnouwy","bceklmnouvw","klmnuvwxy","ad","klmnoux","gjpqrst","abcdegij","fghijkpqrst","fghijlmnopqrst","abcdefj","fghijklmnops","fghijklmnoqs","ghi","fghijqst","abcdemo","abcdefghijkl","fghklmnopqrst","no","klmnopqrstuwxy","klmnopqrstvwx","abcdeklmnou","abdefghijklmno","klmnopqrstxy","acfghij","pqrstuvwy","kuvw","abcdehi","de","fghijpq","lmuvwxy","abcdelmouvw","abdfghij","knuvwxy","acde","cuvw","uw","kmopqrstuvwxy","abcfghij","fghij","abcdeklmo","abcdehij","abcdek","fghijklmnoqrst","pqrstvx","klmnopqrstvx","abc","klmnoqrstuvwxy","acklmnouvw","afghijklmno","abcdeklmnuvw","abcdei","fgiklmno","klmnopqrstuvw","abcklmnouvw","abcdelmnuvw","abcdehj","abcdefghijlo","fghpqrst","acfghijklmno","abcdeg","klpqrst","klmouvw","bdfghijklmno","aefghijklmno","fijklmnopqrst","fghijps","fghijklnpqrst","fghijklmnop","fklmno","klmnopqrstw","abcdfghijklmno","fj","lnopqrst","fghijkmpqrst","fghijlnopqrst","ux","fgjklmno","fghijklmnopqr","abcdeghjklmno","abcdefghijkmn","abcdegiklmno","abcdefiklmno","acdeklmno","klmnops","fghijklmnopqrt","fghijklmnoqt","abcdegj","acdklmno","abcdeghi","abcdelmuvw","abcdefg","fghijkl","gjklmnopqrst","hipqrst","klmnopqstuvwxy","lnuvw","ghijpqrst","pqrstuvwxy","klmnovwx","klmnoqstuvwxy","bcklmnouvw","abdeklmnouvw","fghijklmnopq","abcdefghijk","abcdefghijklno","fiklmnopqrst","klmnopq","npqrstuvwxy","klmnopqrstwx","abcdefi","lpqrst","ghijklmnopqrst","bd","bcuvw","hjklmnopqrst","adfghijklmno","klmnosuvwxy","louvwxy","bce","gpqrst","fghijklmnot","wy","pqrstvwxy","fghijkln","lmouvw","gi","fghijn","fhklmnopqrst","ghj","klpqrstuvwxy","abcdefgklmno","fghijlmo","fghijo","fhpqrst","klmnoprs","abcefghij","abcdeklno","abcdefghijlmno","kmnpqrst","fghijklmnoq","abcdefhij","fghijklmnopt","klmnopt","abcdefklmno","abcdelno","pqrstw","fghijlopqrst","bfghij","abuvw","abcdefghijln","ac","aefghij","prs","lmnopqrstuvwxy","abcdefghijn","klmnopqrstux","luvw","giklmno","kpqrst","jpqrst","fghijrt","fghijlo","abcdefij","fghijklmnorst","fghijqrst","tuvwxy","fghijlmopqrst","klmnouwxy","bdeuvw","fghijprt","klmnoprst","pqrstuvy","fghijpqrt","fgj","pqrstvxy","abdefghij","abcdegh","abefghij","lno","klmnopuvwxy","klmnouvwxy","fghijrst","cd","euvw","hijpqrst","pqrst","klopqrst","gijpqrst","klmnopqrs","fghijk","klopqrstuvwxy","rtuvwxy","klmnorstuvwxy","stuvwxy","abcdevw","cdefghijklmno","bdeklmno","pqstuvwxy","fghipqrst","fghijpst","kmn","mo","abcdeuw","qst","fghijklmnost","klnopqrst","abcdekm","abcdefgj","klmnopqrstuvy","kouvw","abcdelmnouvw","abefghijklmno","fgipqrst","klm","klmnopstuvwxy","abcdekmno","fghijmno","pqrstvw","kmouvw","cdeklmno","st","fij","fhiklmno","abcdefghklmno","lmnuvwxy","klmnovwy","klmnow","mnuvw","fghijklmnpqrst","klmnoxy","fghklmno","b","lopqrst","pqrstuvw","abcdekmouvw","abcdeklmnouw","acduvw","klmnoq","bde","pqrstxy","qrs","bcdeklmnouvw","abcdekmo","abcdefghijkn","kno","abcdefghijklm","abcdefgij","kmopqrst","kmnuvwxy","pqrstuvwx","fghijkmn","acdefghij","fghijmn","qr","l","kmnopqrstuvwxy","abcdefghijl","afghij","auvw","abcdew","klmnopqrstwy","adfghij","abcdeghij","lmopqrstuvwxy","abcdefghijklmn","uvx","km","abcdefijklmno","abcdeij","pq","lnpqrst","bdfghij","abcdefhj","mopqrstuvwxy","fghijklmnopqs","fghijqt","ade","abcdejklmno","fghijklmpqrst","pqrstuvxy","mouvw","mopqrst","lmnopqrst","abcdefhjklmno","acdklmnouvw","bcklmno","nopqrst","qrt","fghijlmnpqrst","pqrstuv","klmnos","pqrstwxy","fgjklmnopqrst","pqrstuw","klmnopqrstuvxy","fhijklmno","abcdekmnuvw","ghjklmno","klmnoprtuvwxy","abcdefghijlmn","klmouvwxy","abcdegjklmno","p","hiklmnopqrst","rstuvwxy","gh","cdfghijklmno","klmnou","iklmno","klmnopqrstvxy","lmpqrstuvwxy","prtuvwxy","klmnovwxy","pqst","klmnortuvwxy","lmnpqrstuvwxy","fghijmpqrst","ghiklmnopqrst","klmpqrst","klmnoprstuvwxy","ghklmno","fghijopqrst","klmnoqruvwxy","abcdeklmouvw","ae","abcfghijklmno","vw","fghijr","kmnpqrstuvwxy","fghijklpqrst","vwxy","uxy","cklmnouvw","abcdefghijkm","uvw","bcd","bcefghij","abcdeiklmno","klmnot","cduvw","fghijmo","eklmnouvw","klmnopqrstuwy","kmnuvw","lmouvwxy","abcdefghijlmo","cefghij","klmnoqs","klmnouwx","kmuvwxy","ceklmnouvw","fghijklmnoqrs","abduvw","abceklmno","ghijklmno","abcdefghijmn","bcdfghij","pqrstvwx","fghijlpqrst","gijklmnopqrst","abcdelnuvw","pqrstvwy","pr","fghijklmnos","c","fghijklmno","abcdefghijkmno","abcuvw","abcdev","abeuvw","pqrstuvx","klo","fghijln","klmnpqrstuvwxy","abcdefghijlno","fghijklmnopst","acd","gipqrst","w","abcdenuvw","deuvw","abcdeklmnouvw","fg","cdeuvw","lmnuvw","abcdenouvw","klmnoqt","hklmnopqrst","klmnouvwy","gijklmno","klmnopqrst","fghijmopqrst","kmno","f","uv","fhij","knuvw","klmnor","klnouvwxy","bcdeuvw","bdklmno","abklmnouvw","abcdehjklmno","bcde","fghijklmo","abcdefghijklmo","ko","abcdeklmuvw","bcdefghijklmno","beuvw","qstuvwxy","aeklmnouvw","h","t","kmuvw","fhi","fjklmnopqrst","hiklmno","fhipqrst","qrtuvwxy","abcdeklnuvw","fghijqrt","pqrstx","bdefghijklmno","gj","abcdelmno","abcdefjklmno","fhjpqrst","klnpqrst","fgijklmnopqrst","abcdelm","fghijrs","klmnouw","fhklmno","abcdeln","fgijpqrst","fghijklmnoqst","abeklmnouvw","klmuvw","i","lmno","fghijklo","fghijkm","g","adklmnouvw","be","abcdefgjklmno","prst","puvwxy","qrstuvwxy","klmnov","klmnopqrstuvwx","acefghijklmno","fghijpqrs","fhj","abklmno","abcd","fiklmno","ijpqrst","fghijnpqrst","lmnouvw","suvwxy","knouvw","duvw","fghijkmno","bdefghij","aceklmno","fgklmno","fghijst","adefghij","fghijklmnopqrs","bcdefghij","abcdefghijko","klmnotuvwxy","klmnopruvwxy","klmnovxy","qtuvwxy","fhjklmnopqrst","klmnoqrst","prt","fghijt","uvwx","abcdekmnouvw","dfghij","abcdehiklmno","klmnopqrstu","adeklmnouvw","abcdefghijmno","klmnopquvwxy","abcdefghijkln","mnpqrst","fghijlmn","lnopqrstuvwxy","pqrt","fghijpt","abcde","ij","bcdklmnouvw","fghijkn","pst","bdklmnouvw","abcdeko","fh","fjpqrst","fghijqr","beklmno","fghijklopqrst","lmuvw","klouvw","fghijpqr","abcdegi","psuvwxy","klnopqrstuvwxy","abcdelmn","fhiklmnopqrst","fghijprst","lnpqrstuvwxy","qruvwxy","aduvw","abcdekmuvw","adklmno","abcdeu","cefghijklmno","lm","hjklmno","abcdefghijklo","klmnoqrs","fghijko","ouvw","pqrstu","mnopqrst","louvw","prsuvwxy","abcdekno","klmnopqruvwxy","kpqrstuvwxy","abcdefgijklmno","klmnors","abcdefghijo","npqrst","knopqrstuvwxy","vx","fghijqrs","klmnopqrstuxy","u","aceuvw","klmnopqrtuvwxy","uvwxy","fipqrst","klmnowxy","befghij","gklmnopqrst","abe","mnopqrstuvwxy","fghijklmnoprs","abcdeo","eklmno","fgi","fghijlmpqrst","qt","abcdefghi","bcduvw","bduvw","klouvwxy","kouvwxy","fghiklmno","abcdemno","pqsuvwxy","ab","klmnopqrstvwxy","pqrstv","abfghijklmno","beklmnouvw","fghijklm","pqrsuvwxy","acdeklmnouvw","vwy","ghjpqrst","fghijl","klmnopqrstvy","abcdelouvw","fhijklmnopqrst","klmpqrstuvwxy","abcdef","bcfghij","fghijkno","kopqrst","rsuvwxy","abcdekmn","aklmno","dfghijklmno","abcdeklouvw","klmnpqrst","abcdeklmnouv","knpqrst","aceklmnouvw","kl","fghijprs","rt","klmnopqrsuvwxy","bfghijklmno","klmnouv","abcdefh","s","klmnouvwx","fghijp","uwxy","fghijq","klmnoqr","vxy","fgpqrst","fghijlmno","defghij","pqtuvwxy","dklmno","klno","klmnowy","abcdemn","abcdeklnouvw","ptuvwxy","abcdehijklmno","acuvw","bcdfghijklmno","abcdemouvw","abcdefgi","opqrstuvwxy","v","lmpqrst","abcdeuvw","abcdekouvw","qrst","klmopqrstuvwxy","prstuvwxy","lmnpqrst","pqrstvy","abcdfghij","klmnop","ijklmnopqrst","klnpqrstuvwxy","klmnopqr","xy","abcdeklo","abd","klmnouvy","klmuvwxy","abcefghijklmno","fghijkopqrst","fghijklmnoprst","ruvwxy","m","e","abcdej","hpqrst","bceuvw","fghijmnpqrst","pqrstwy","klmnopqrstx","qsuvwxy","fghijknpqrst","bcdeklmno","klmopqrst","bdeklmnouvw","klmnopqst","klmnopqrstuvx","acklmno","hjpqrst","abcklmno","rst"])
assert num3 == solution(["ysvydhncudvxqgub","jxomzgqmpccovmyy","hxiwwqdowwbdzrql","zqfykhyqgxpuedhx","vhszanyizlocrcta","dthywqimclejyrxf","pxvnsacefcaeqwpn","eibroystpzgkhwkt","efioczniyhzlkgxx","jbafyifjrdsevjlt","noggsbrxuzxxxpnv","usxugdobkxyvebgp","omppygjbdzvfncoh","lszhxcyfyhbezqpl","sywbjmfmigsrdhbe","kmitesfpzturedvn","fhccayoplynamcmf","xwkxxvmngwdkktcq","bkdetlrdtrvxtwnm","otbqjkibazuiuzjc","bvdlpsuozpxykhso","sfkdemywenvutigi","zlsgexavkjlbniyz","omvmljrelegkrnly","ncfqxwbgspmmxequ","nsnusovrqfyjqcmi","xmfltlmbucykoygu","znevkwdmcjkxazvx","qmmlumphgweyuqll","vvwllhnjjilkkfbr","tfczebbrmcwkijpy","dyqudxtooxmzaivg","qabmbvkkacpipzwv","ousivmwzqkzowbsf","wiajbnzcyczvdkme","jtvkqglawuiitvne","hynkguvzlahiaweu","dcdhzutcxsrwhtiu","sjkbkfbzcltyhkzc","vmtoulenvyzgmzph","hhpjlqospgyrpjnr","trxsiqvzjdsumnbx","ifmzrmfjlfbxrspp","zuybbnxweoodzrcp","dqselcmauqpdbvji","ucdmjxlnodsqbtpf","yxqxoqyqsuxbvvwh","jifmvnffunc2jlgdux","fttypgxftlzhrjhu","rzmkqtaejgzrwvht","fylzmnvoslrjeuhu","xxhmsywcfchxybtz","nivviopjjkilmfnt","vlvtonhigprfttuk","cwgnurrfabcfotdmj","erjxfseyzaygaujp","nrcqdwczglmcvinq","dqbyglmywihtexid","vqggccuiimjqqpuz","wbvvklwhouxxcbzg","jxstdmcbouqvysje","envdnanmuewgheqr","oxjeneckyoxdypwq","ityoxogkfmlasgfq","tgpkcweywtqopjnc","hepoijpjgvckkqzc","ubppuzmagmjgmjnf","snvaiqinphtkbxtc","wvdwymqejrygisbn","kmbwjynfbwyablvs","rsscpinfcegvnulj","oplzudhvjaumtavx","oionhndcrjvfexir","cxxlrudrixtmjsgw","sfngfbrksewwbwuo","wngezcjkxlftmure","xgkmmsvjjvtlwyko","dfaihamfjrwobkai","ybzlbmtejcbhkbqn","yvgttkpmodjrdjaj","wsfkdifjxsisyazp","btdahuinzvvmyuti","sppdjjphoadtnxqz","idikaxmkupaaeyvd","bxmusrwhsuglelsa","wllftkyuyjwumzfz","lsrfakcruqfghhqr","oitbsfztaayzgttw","qvdaclqbkxzxtvji","hqtnylqopcuyitvv","dovrsivynjuycgob","zbeexmgffbvgyukt","jnyrkwuketocbnlp","kesivzsfimkupknz","fvctuhkhcsxgpnlc","geyiflxobsqqgysp","vdhnckkljiwiylkc","jxixmpjvkuisogjx","ggmgthlqqfjzvsiv","nkdbbqswrytidodb","cvnxasfxcyyprwky","msptawajcgigotxx","lggqfreicrrzgqug","pywexuvmpapzhhmk","yjfzlaazckdxqhpk","gxopiqnejwahizvy","rwptjuqhjshtosim","zhszbxltmwjfbcnn","hznbmqrhucjlhtev","repwvulbjzulzqlm","juemhyiaujdhjwda","iphegtklhgyiabcof","tpqxoalgjntzhxph","ahnrxtoyzqrqrxce","ljsunmfpleczezfi","flqbbwjpvmpiagkm","enxrdnasgsrczncm","setirvmdopdbgqqi","uuyoeqtcgvygmlbd","gznmxhdzpgclmmce","wrqmvtilsmjrfruj","nzbqahmftsbygrje","nodxqfwosevxikai","ynzmckxtfampkdcb","ishsysxcjavxukfq","mbwcnmktksqoptdx","ybpgwitxuarhyuud","odkhmislpnpjltvc","imlknoihasmgbjle","autoweexfbmsnamc","pzddxvvmnmujzovy","zbklmwsqltyiqjaq","wsfezmwlwnovzfnq","ipvtflaxlabczbjwg","xmeypiupgboeikma","qmhxpnusoafktsrp","akbzwaoevusmqhjy","ptnrluxfiaoedirs","fkkujjetvujaffev","iqlaebkqlabcuugvd","tvfazupnodyxyegj","cxxbmckkoocwwmkv","eiinwggrnufbuefm","jbajzgyvabcjrpirb","anotitqeflusqkmx","kkyyjfyqfwuyphvs","mkxxxgmewnnfmtgw","rfzfkowvhlbuptnn","yihacnrktjrrbupi","ljbfbmrxivbqhvgn","kelkifhcummieqec","qwglfqmlgtufeggt","ztdsjupiobdswepc","nxxrjnqebfrtztab","zwuijitgzkamuohu","skctyqbrtdlybrad","ftvbzzqisluhwvoj","tkyzlbdwikxwxtfm","yqzbwtibgyhezefc","ugmtditxujqhzdjk","pzqfxlcsbyiayoqn","mvuvmubzxoapqlwq","wxydvrxojyifgild","gaubuvvoncoahhqs","arrqgidasqpyozqo","hlktmcpfqmqunsiw","hpshspcjtkvjtyfc","xwdjpdyqbgkvbbto","dnipqamvliabetfk","zrptncovohuprjfj","zykerhdnpwqnklnp","wehvwpjsjmlhbxme","qhabvcixedhtacnm","nzbonhjtiragsjxu","piktfsxlejzjpmxa","kpgluxplomivhups","utbqkkbmdakmajvb","pbosjdvammowabof","hwwpavjyghyogxiz","qixjbuehpllqwbir","watokwdhqrlthmyt","fiuvnmucwsfhvirt","efjbktqktzylkzym","eyagoufvrlrbukvi","dbebcdxywrceoioj","dmejkiuqtpzkvtil","irxxxrbxjvvisefx","ezacasyffovrewri","zfoernjrzvxkzqjn","krrmkfftxdxqxrjf","xexiopshwbkipjdw","cnuiizhcocljycvu","idsxihqjacgtwiuu","nwjjtbiketrqdvxb","avmxhxabcxhflzcbs","uqxjgosfyjcbxshz","gwybdcsgvjjacjoq","zokabcujdqyhfvvve","dudqkxdyvnmzxbal","duurelhvlvlwtisc","vvduznkfxsydjjsu","jvohyxbezkxdybjk","tecmjpqvbqdfgbch","wmiwtqmxlipobteb","bzhfoutsommbeahv","pzxilyvfyokfmsmr","fvptnoujoahvjljv","nntjwlzvtlwjijtq","iiahigptxppvjwwh","fiwxrfkvznhngctp","hljuecxsqwhfhooj","kpgylifngxbybkwm","ckxgbjjygzkystat","anxjpmmadenhxunx","kztzbysfhebhkxhw","qeywqntlveiebhos","jlbvhtvumiyxwqlo","ubsttmdcjigfizes","tifeodqhusljfhxl","xhtrvehthwvsxkmj","slytykltdhwruorn","ettsedvbbxttpkwg","znlstbcrbxxyauvt","zvxkminzbadeyxpn","vkeqpqwrdrzvrdkg","lmgvnrmbwermpsxx","wpcihvumyumoljws","sqqleapevuisjovs","xrtefpneewlrlvwd","mmbabccilwfyvvjak","mqebclxzlkierkjf","cuytrwygyntgajgm","fhodjnmtmzrqzszj","kmgwmlnfykcuvqnl","aopjewaqievtqdct","tjouxksorchkworv","ncirabcozpldzewjz","sucivpgmovkfqxpn","akhusibommljkvfb","cdxrtkejlxftegjn","pcykwqocqfjcpygs","ddgipyltjxtthplq","uqtqauyppkzzztxr","byziilqifrkefnmx","pihmqvosbrmfwvgj","zcrokjgwuujlsqzk","midiigvhwxuuxdoj","quzizelifvrqgiqy","qoizxtjfeiykktbh","kopvmoiueozhbxfe","rabczignulcwpsobz","esmkumjwclulmmlg","cwknucjbjropshgm","xrkvscqbnuofxbbd","lfhexistfbnypjxb","qtvceoxufqerkgcd","nvqnrbzmizbmenoj","vaxeseydjahzmeqv","kkhvyzvdlupbekot","ghkdrqrrufndvlab","puuorkmgkyjrrfzm","qdojlkfsajazdbtr","trunvamzxxtruqqk","wyfqiycmuaxnwdmj","tehftxcnimfcgulv","xideohbursltsyaw","zukuxtscehugrlwz","tqyowyifdxmlekmi","gktvxxotbobtzjhz","sbrdswxuitwshrql","vjxkqyvipqlevbhk","xupvseicxsjlvprl","zzvgmaspjzobbbai","umqxughwbhxrbgnv","necgnedkdtsxllws","kfzhgtbffdkcmemk","jygmwohqgxytdabcc","xubntcuzhakycmhb","nykkvobihcvcbsom","jmpfjbgethlvegac","rcrkrqlqszizkuwn","mkvtjvezpqntwsor","vavxnwabzsvbxrta","wxjtawscbrqldboj","ukqyxnzmmregydtj","bzdoqdhyfxjhrtca","zwwifjejxilnlncq","zbhinfwhbsewmmnj","wpatetlrcetrwygn","qijjqtjtkjldjzpv","wizlmxgtbqokdive","gjowgwgtfyoyvakj","dutziyzhjwwdwbmh","hhxlvaslalqnjfez","nftbzbqrrdhpbvel","rawgbwriyffuvwea","qelvbxvcmyipiyux","gpvbmgzpjpvmfjou","edysbthmpzewjmhq","gimdgabewrjfmouq","kabamudmytcvskgz","jnbqnbtzepeettut","ubycgxbczobyuvty","ncqlwqzzlurrfurm","mqdliidaptajnque","aqkislhbhutlmskx","kqgowgleasjmgjro","anzasevxbinscrwy","mligzlmekbqjtlkz","acjwzeaariolohth","lewbaeswgtsegzgf","bkaleiidkzgtyukg","griqeggfgygajdxr","tiqtuoakcxhsppug","djwebkqgutgcqjkq","mtdquygxxpcnmxvg","lzbitojuuxxhrcms","wkqdzfkdeoxlrrrv","qdkvpynqxmqizxfh","rsypvochupieijuw","zhjqkrovsdewbwrg","cojrovhotitqglxf","vupizqllrxepdyej","rrcescgfpodyqgqj","enyhpwibqizxzxlf","ysgpfnkxewxpunmc","qqayjdiwesfhjqdj","vvxsqmsxkwlowkaz","vhbgvteemnjcjzjn","pjvysfsrgpzeefgi","hjpqwdkuxpvojlrb","qdviqqkpfpmusqku","zekclapatdchkkuu","ushhsykosapkwfvn","qlwhigtykfafzwkf","ueeemzyxxionuzvh","uxidcslniryrlkfr","wjrqpxvnjwnzvhaw","sfufkmlseobjehmb","viqcfxqgzfgjlwyn","vfffdaynlllgflud","xgbzqwuziammugee","juwviucofrqykbph","nfhofnyrvpgnrncr","xwnrmtztbduhaxzm","qwjuwencytcviddt","zgtzokhuophlklax","yhhhyqbivjulhxzz","qjlrmtnkpezzxbip","csjtxagscqzcyxgw","gibiwnkxfwmdypdb","zwuqefypxjswiqnr","rvwoomgislxnjiku","avtzjpgdqkrswwil","tybnjxlyeppveuln","hvjlkwgdbzjuthio","uwmvnynpvcrtjaoi","tazibajxbbektuny","eydtgcsqrjeudusa","cjvzwcgypecfudux","oovnezznsbbuzage","jjeciyognokzoavb","ewwzxbjfxgyrwdnz","mqtotsnaejvwsfxv","hewhemklxufjlxds","qfgrjckxuvxppffa","xrkanxmmdhjnrpms","ugszqiazpribuhin","hhtlbstnuebaovan","wmerwupitfwffwjq","cfhlftbplljrdnmt","iwgvszqjzoutyofq","rfddyjwanuajwfms","glcpwdgghxjjlbhl","opyabchjxtqeaqluw","zqrzsgsurxcablbp","tlzsuhpazrgyftra","hfbywjxrjvfyfjor","xfuisoaqkhitaneo","jbmpkilwrfevuabc","riftearjllxbsrpg","visatalbyphvpcqn","tezwyeuynxiqceny","gmllnngsknyuqfyg","jcptptnztjtczgin","sfslwzsttdrouqmi","oprcoelsndlnehzv","cfmhxjwgozohudcf","mhxzekxwbbccbumx","qeqyvhpujfgrmiop","gtqtcpovarcorjrf","aloszdzbbywgchfd","dknbhpmmjnuehczn","ebkeuntykvvfywib","nlgiglojmpbxhafl","uswobtqjlbukbjdo","deinrxindafjewms","bgkkntzoayoycmii","ibgusyotlezfhixr","jhduofjmetuvulfv","ncomoknshtsctgif","oeqgwqzgiuxzwnbo","kfqhheuvmfwtbokw","iqsoqygphhfktibu","bobacxbmnfzanumt","knnwtzpjwzujuuxw","vfnlobdgwymhcgun","gsvqncqugmzlvkcc","fqnfjzhlmmsjzvxx","isynioqvlkzdhldw","ysyenabcioynjgrzo","mgarisubmmtmxaqu","tlkplxdwjvivozqu","uumvkpkfqckauzpy","jqzzndmsdwuznmii","cqqaephdukcklkkh","arqsbqajtlzbxspv","fpwnogjkszhusmqn","arkauhwcnzyhgzgp","mmlbhlqmmpxdsjpr","hxsyiwgylwvfxvqf","fmgsmcxhczkblvrr","jfsbaiqqmrcqziyh","yonriirnykgcqqoa","loqnbxhvnqhefnzc","vnrwfrtawnjzmzpr","nwvmixbdevbawgcb","ssoscjougdkdgwzy","tdotnfxymskkechy","gdqyqjahcohateim","nmpingpzculglnzq","oshxfncaghkzfflo","brqucwymtbtbpkmg","dlbolallmawftyne","zaygaqdomkdndypz","frynwfgjeyczjiyj","fkrmnqytsxookgtf","ztsuspdffprgefji","urmvtcqxbzqlfenp","jtqnervrgeqgltma","mxazffkgorgqvasd","ohxmmsvrbcbakvtz","gvgbadnzvabrkajj","ytxszlngumxdrxgs","uyrufyweypbkrbcg","ylelxbcmvwdqlsst","fnqgyqxovwwitolz","nmrqcgovdmaregoh","jabcyxscsxpdwhduv","agyjbfjdrxsdxcbz","rsxthmvbbfsbapza","bnulsywwhvtckkmm","oetgshifgdhknjen","fdacdxgrjnfqhbgl","ltrpuqvqvaaijmix","aalhlxvddlhxsyev","qubggjexevkjzapf","qffkqkgvbxyrncum","ouebeyqrrbwluaiu","bsmvockhhfxdvwnn","wzyrusboriskzetg","qtkohvlnoxldzkhe","sknqielwtnmdozdk","hueabhcqpsziqofs","qvdcptldvpyzwbwt","gmcsgkgfgdzvdywo","whcybgsdsunkkpqd","zouenychsloywadi","ofnixothejurjqwx","baurihhbpsuzaxdz","odnxgsawwegaqqsk","avnvjxfrofflpnfl","fpeejbcasyuuirri","lnqcckixeovoabad","ogzfwbnpmoqzdxqb","lsfpkmktczfkgase","ckfkwbmenshnuzrk","puuxkxfbbtdttkec","oxplgbgxocgwayuc","tgxfplgbhcjubdtg","cpcwhsckcdfhbwmp","huaukdwwqenjsnbr","hvofxghsjlfhswhp","vnwbsvtnpfpwatiw","mcbkpsbgywhqxsix","zksceqawvnemisil","ojpmvjelrldcqflk","ppfxcvjrjywbkaci","vkkkabrzumejtwdr","jzzvegddqgtogyel","fvwxxwbukfrbazxg","rpvgsjrcsunopqja","ngjxvxsqxcboieeo","xgrdakguxugvngjr","zlixckrlsfjnvwiw","kqqahdzvaovwrarw","zeqmlrqvcymohkfc","fkdmammoniaqeaei","ktrvrgxstgvttftq","skujpfmasgqboljm","ydenwjcdlcdtodqp","hgsuqywmnwmyfotr","waufauuijgxaqceu","gbudfydfhbvoamth","afskwqlszmvafeqm","nbsjuuyfqbhqajok","iiawyxcdikosbwsx","kgqvvxhnmswfngde","icqcdxpedlxpvgms","wpxzbdlhhvarycks","wkwdjgkzzrmuhuol","swsgbdcrbhqhfcci","kgmkgeiryynvhwah","cmpvksdyjvmbdfhj","uglxrzjgijfcvhbx","bgevfvpmocxgausz","uqojyggipoyuwkby","avlnovzpuzubuuss","eyghurrorndubcsm","zdnntbwcugnykdti","lchrlndexvovoznd","cpnizzfmpzinymlk","hskvkurwexwqasxt","xprysdqnfmvifwjy","ngzdbejzpatoixnp","zxomsbqlfuhemazl","iqvuegauwclhvqma","tzdgvyptuayjvktt","zvhbvljserqbcbir","mukwzypdxlegwipe","uslhhogibvwqzhyz","rylrlapnfsdogovl","impmhoqumkogchoq","zarlqxhzfwhqjsms","ymxpexvboiwzkomy","nhgexfzvunjnosgb","wslojqmvusvumclp","uufkkyrchehmokjr","uadbebqfwaewmzdk","wwzazyhamqhdwjzc","yrwrqxhvmzfeiqpa","gycblakmiqqoioke","gpyfmbzhhhtuysyf","agtyhlalmwzmpnes","jhbfquwnkzzmmrqg","xahekbixkfaidgkb","njiajqrymsbxsfyj","xrhkzoerfwjjjvyv","mojaewgjwmmxmmcj","mcimexhcqqptnotx","lshefqasobmbuxdd","srgglcluxgheudmy","cgxocmkqzjagwgmm","iyreabcwxbnkpsjoa","zaljaqjvfvvqdays","gskeygtjgbijvkjn","smpslnyxjvbhjyvh","raeaxhedueaayvlp","vbzqcqhzdaptsdts","enurfjqxyapakpyu","xesnqtvzlkjudkgx","kjwfyrasqtafiyri","bsbavcxzjuaksbld","hstmbonbgsleppae","exyhezlohmqkhxlr","rqmhckbvtfyqwsxh","wfnvwsffbdliqsll","eaqnrvadjaojgfsm","rhocxroqdqrervjn","mzdczcvbrhjwcdve","yxlrftymqxqtbvso","baunrbrfzrapqzit","oipmrdynelruxvry","khppolojdkojxwqv","umwgrzharatzdqjb","jbabfxajhdducgsw","ohtxxfqthypvhbca","knwjiwadhywkwlsz","qteikhwuuasdyvpn","ytdeibtvnlysssfj","bdcflvlghfonjfik","eactaiaqtgrhwkbn","evfodntmumnmpltz","zklhlzjiueabafnz","zrsbbgkjcseqeang","cbvthkbgywxvjkhh","gykehthvmdzklzmm","bhrydwsdwtqaxyhu","abchczaihcevacgzx","yonhiezjoqwosrwx","lpwsvvjbtimkqkaz","tibcufriphwxwzhj","kqxnnvmxdyubsyma","jdjdalrfdvtzjzzf","qzijzvthlydyayby","xsmhbxalbihmkgmr","ickheeqdhkhfvagy","zgancfyzdspdikye","rglysjgxdhtlirpe","xwmvbwnbknuynzms","rtggytyubuthyvdu","hjfqzmmiqdopyduc","yyeixxunfkstmdly","stccdhodaeauqskv","bsemgaskpcgvmcgd","todqxrxzpksoowqy","wqpfgvkppuehavdx","oecawvidnbencfzv","ocpbksbgdutggshn","hvfvfvhuwftqdtys","raqymywkbzpjsomo","mnsgyltrdguifeom","zrtwkfvmrxgmebpc","esnlddvhmlycfnzm","ujmrrippyxxaitjd","cjqopvqjmwdwrhtc","axterdjcgvvkvjmt","wsfjhyhiwcskrnzl","excxprrgtvsdstkq","bqpvnpcbqbjeorfs","zgrbyxqcahdirxzz","ibruhcuhiwpsndjo","dmningijzetvgssq","vsbnskosiigyjwhd","gvbexrsmzefdfjra","rnjdwommvluzgmiw","qfnpnioafynmfnch","iutdykdyrnjbijim","yybpzynyyvqsibqw","ukcumxubdajklbow","qpfhjabesozcqxnt","ogpjowmcxjvltaei","nmmgxxpblhyvjcza","rsdicjpuitrhjhoo","rougghrsdcuhaxkb","ccoubobkldovhdha","heeysansiaiqecsy","txyzgixqzbqoyddo","zgonqkaonzusldmu","ksvocdxauzvzaqej","tthfhimluvparxna","jrfaqfteargbowaq","vwgdxfzukfkbwmoi","kxaxverroublhnkg","hxcyocruwhxerkwv","waaywxwtrwpnwcxe","kbrwbedcrxacnfzn","heqhjudnrfmpgffr","zoninmtmgfzwfivy","nhdjsbedakglczfb","eyklkfsriufgdeta","cdtcihvzlfrxcqkk","nszlmuisqibdhuij","frfwwwunnpwouryl","bahmwsfifpehpvlm","xinovuwjryvjderk","stdxirugdjwsxdrf","ukzsodimorlbassb","dcqdmnpirlwetexz","lnkkravbrdzuaixf","iqhikikqgoabcupoz","tqqnskydlxxyeloy","hoqhujloveotexob","tafrmbzoiiyxkrpv","gedftcwddbvqbcbp","tmlvgfxezfqhqlro","omkqddentowyusgs","uvmoywmfgcxprcob","wxaexnkxfscqpbvn","arouwkkwzmpxcraq","oshuiowfgoxvscum","wlcbjlvtpwbizxkk","pqdqfcardhablnlm","hncftotfykwkmcwc","ilbkfisyjvqmmjox","mjziuevwvgazkmrr","qxftpuleqzgeoxkn","qwfbcoulervauwzy","hzzahmyatnakmfkm","atlkeburbqttzgdv","chctjbylvaqivhnu","kljxzdlufmjsakrn","ldqznwrdmigxmplj","jnzsugujwghliiyj","davvfzptwjezrtut","ayvxlihyfxjghbnj","damnybtgbouyhgvm","xycclwykeleqgqbz","xcexkuimhauveeep","alawhglfqmrpujdu","ucqkzhnxzfmhrscm","giqfhrubpvulkbcz","ibjyvrczdfvorhxe","qbwwxgvtphqitwrc","nznctodxeivfdauc","gcelouuuaxwxmvsw","rqelrfgexnkdnazl","fbepvxtrhujvrdfc","iczbfakdstudncnv","qwyjcjokwchroxbr","ycjrzaetiivrrdkc","hjaflkntduxbssgu","rwfrleciyxwvxygj","pfkodbjvlrgvryzh","fyvawqjluonvjjxc","nzkedkvundnsfmnm","zkvlbpsldcyafkpj","hrnjhejkhdkcmnmh","sydwdkxfjjkvvbfk","ydznqbenlyrstgmu","katzotudzcpwwvkb","xucadxwemqvixtva","nnbzlmlmesntwwhh","sidmvrqryepebkda","zqlfnaleybermqpx","kduaxanohkcebsaj","jajuaudbrkkcnyyq","rhtefiqjirzhpjwt","tgbyhnyxxivxpebp","oqqwgmpqimqnjrxz","tptopmpejaaaxokz","rglhbkxoupbeqxhn","diannxikfirreuin","ilkjfpwdabcorejuk","tzygwhlicpqhsxsm","ednqyfigrhjjsixi","ichtvcqqxhzvwyrk","ckyoxfbufktqznpj","xoskspafepfgeeit","jcbtyhklimaasdfu","cfkabckzjghzapvxx","owdyarpowhkunwhy","etnyrgssgohswpva","ccdzytrxkxrfobiv","vxmwodlmkjmnanqf","lfoyuzoffzuzknom","avpouwwwczpcsixm","befuilgwreabcsjqn","wwlkjupnpinaskti","wuaufrnozwrcwrux","ddmlqscfylvvlqet","ngtehvarjqltinad","hxilufvmpbmybqse","sxckpnkpctadurmj","tkauepahazlgunce","wdnczbubbvaeugur","blbtvambkabhgfmt","hscywaqlqpzmajlw","kqbcyrflffoyrrde","swatgwoezppbhzrz","wncpezwknhwlkyfa","fxoalqugauheullc","yfejaqfwodcbvjxo","srdidycbfudekvry","wbmqrnpsbwvajyst","eojhwvsjkhruoihy","lebgsqpfytyfljzy","nlfrksicpahzoyzs","vwfuihhrcdfzahuq","zxossokxsiilrhwn","nnogzvnyavbajgxg","xudcsovkwdigfykp","oxnernpkebnwtzgk","lpkluymjfczcabbg","xwmoythsnnalagrd","bwxqduzhwponwuxh","tvqujorvigsrzqra","ruhirwfwnudvhndi","yigakwntqrddbxel","doyelkmwfiqrcvwf","nqepgxvwmpczbqmp","euwsrbwhhaosbuxv","qybvertwzftjmsbo","ovrxezhfnplztkrf","zhsklztsgdxqqlos","hjkalxuedegqevxf","acqcmxxnvxiyiarj","irfjxvnxvcwfggyf","ivjlvhotuhyjrbqi","ybowwazfbqnlxhix","rwldwkwiuokthyvd","emeoryhhzmchkcaf","wkjtfktltlxrpodu","zozxqufosbvhvzmk","kejjywawtflpnzxq","tgjqeqqyflstgyfn","edodalhdkbpbvbbi","svvbrdqtivcocuok","jqycfyojmcojaike","uysmgvolzqhvrjcg","jepqutdjnzdxpuis","htypdjotmvugsqrn","ruanlnsslyvcmloa","rmguapshfylrqcyw","idmrozfesprjyydi","igiijxxuaewkngez","mmfbpbxhjbbtaktl","wbryhbistnsnxcre","eyypsgultocxkddt","hmgsapmnlbhkldjy","srdiuczmorzzmqmx","jydlzvjtvssbiriv","xyxlubdngtpamnie","hzxhqmvdfeelavey","dnmkfxoqikbpnncm","uvykqjhcbjrkhwws","hcouhxnefskqtsmj","tlzdfixqvzmpnxey","bqthxadcjbuoihjb","amqcryxqrquugjds","kazopbofkzigbrjf","yoazjvgcjnuynogm","cekiuyvsxvnhllot","skaakenhygficler","vyyblxbztgjdxemi","cwijfnzpasohsysb","vxshtpkflepkegsv","dqlajjejvwkljffm","pdrurythrunegiyt","wyniiprlwdxayecx","onzimmmmwsczxrud","wahjycyykcusbzkh","pmxfomqplrchaeji","cuiofjxjmfwmwjpo","mqeyxhbjjhtyiqax","vxjtwryiiaiqmgxc","rpxhygecrrxsorep","pdhcrtkvutpxkjqk","xghqzhfjrcskksay","llatzvkvpehtkmlp","evcdafiqhelayolh","wnpjllgpnngclefg","cplkciggvoivrdrk","rwzojlohceoksqei","ibblbsqbtieahuip","rxymbuhpxlybbpwj","oufytsooclpjthdt","ladsdwyczkhlprsk","lqglakcncwvhbmdq","pvffqrafetpcnonv","ltxqocyoaqwqlclh","ujleyjgijrzxpohv","hdliszkijxjfdhuz","uerwlwcboltvibyv","frnvgotjrsmsvdrv","kprkmutaqpumileg","dyfntcyriixrbzpu","pljixloqwehtiyju","guvbkiuixwtllbyh","aywoiniduriovexc","xkhsubtnkyitnjuu","orgjwbnwirxnlvkv","tbnfpmbwrdvlcids","ljptwryckhaervnt","piklsbpqrpcwtkax","btjqiwzsjhtyrabp","xaqhoeyrofnixysd","ildloryxoleksykm","tpkrvszvlfvhpgua","uomslwptxjarrgtp","qfawaceubqhtfqia","xvsatjnexaphrcsq","chlowdcammoiqswp","vryqjuplbwlaomsw","zkndhkyqnmooseqy","oehmlodyfkbgwggc","ygicydiozmvrkjov","vffghaadldklcvpa","dudkmcpnwktzabcyc","cgpwhbxlqbydfial","xkeqyrbppiqzzdtc","aywomxmmicyapqry","qxrfswxmtgqwiaiu","ogesstqnbrqzcike","quvgbtgtjtgxrqez","ilrohxbbjzdyifwb","mwbgfsetpneteejs","awvqavqersnsgvym","lslutwvxqsgrasxf","hujsniqoktvleeph","tbibnfjtibcusfqc","jkeeyrhwuudkrzmx","rckpwpavcgvgmbqn","drzbjsuvjgfxgpzx","kmdsvposrrdokxzu","lapmakjdxbobqslx","awqhcznyrcbreinx","sgtrrbfxpgcdmlfi","hjvvuazaydvuqzfl","ukvueksttoovtqnx","fjcjtxrbzsrxelui","ynxnlswchgyljfah","ueznbslrhcswvlvg","ixvfnmhdbnowsido","tnvrbemiduyabcpgf","xicjxbvnripjquxk","pnguepiandvkkjgm","fmjuyijqtflklzrz","wowbwesqdjgbnfza","bzhqulhhfrmvlikt","xwwbxkpqwzuvbfcc","tzfeejglmxpjfiob","ttvlzzgyydwznuuj","zsaqdcbxiivqeibj","jqhivhimzrbhfjye","woxtmnynlehbynso","tweacunvvzvxvkhe","wvjiwrdllmbrzyzh","kpawpohuffukizip","culggzusblbzrbvp","rfiaujemuathqnrg","txcebmnimvozhnbq","lbpnqjkgkmqepuca","rqfueobyxicwpkao","rggegjcjqzhrkjqn","xbxlktpwwsergaut","lhowgnysedqhcquk","oqldregahyfprwsi","dizcwcthvgopgnwx","bzpodvsqzlmeakvy","vclpieckqkxhblhl","lnvngowxjpgdkwfv","yvkdxviywwowawba","zxymzgtfqsshclgz","boqkrbmnsxvbiema","hoeexawhwjrohbxe","luocnssrsnrlbmyi","tduuyggdvgbfgmhw","frvhgulszabsrunb","vcsontpzpacsgobo","kaiqymcnijuixgvp","vgfugfulxkppkurw","foudqjgejntrwhke","abldoxtbpltfnsni","kqxvgbgkkoakfeaj","rdkjzlwcpygzkshq","qfjxzlkyrpmuvlrf","depydkicbtuwrbuf","vmpfhqfgcyreyqdl","oneokdfkplafayzn","fjcerifwgajithlr","gtlxawvwmlmqsuuu","wgfxdchxqlzdxcpr","ajdrspwucswacivi","wjzhtgddolhaahmo","hbyrafvgohzefptw","roxblqysntdnkfqx","rmvrjdkeppblcmvy","xzgbkvnyxljluccp","dvvwfjxmydfdzqyt","kxxjltlgbaiguihx","rahukefeaibeekpq","spsdfgpofpoanurm","pjmewktbcytjsvrs","nhtbcrwqzoxbhkyi","eanjdepcqzqdeoea","ujhvaizclocaksng","tkucqzszyktwvyjq","dnummodkocgrdhbx","bzvvgfxvgzqjshji","ddctbuygjncstchf","mrpciqjmowzdjvsm","qhdgxhopljagfbfi","ksnimciprjexohfu","sdfgsfcwgaknzrqt","keiywmjuavometzf","pxdzshicopwmofxl","xdwlukdaxhwjojeq","krnlgjtxhnuntwsa","bpnrhdwfkagaubka","beoyleogpryyjcmv","rrhlmtgpyfszchsi","ozdknlljectjisdg","wdobdazbwjecqcep","jfxjpbzonkvxltib","fwcffctkbvpkgexm","gornbkdvwuqirrlk","yyiqngwrxevbwchf","ggyqhxvbjwyzuxwf","ixhwkhgotdmkamtj","dbqqdygrhtysgxgw","mzwmkjfknwfhulgv","xtngfkkjuaonbemi","vghhkblxwbijsqwi","fkfulljgmpkmvxwn","kqdckewxfcwyjkuo","msaxmgcjerovxgqo","bswhhcxiljhjeivr","lwllrzomgnjzjqxh","gugxbiwfpjbtscyw","mmqsxwrnsiprrmyv","pdjccwbewqxbhgzn","mshemwgzytwmqljx","moezekitiafkvsqr","edthrvvafeypjypw","qspowcqalsukqhhy","wasrmlhgjgalcbrb","dglyfamnfpqkmteh","xgpvsclrqskbjnao","iawgyqoqnmxmwtrk"])
s = calc([num1, num2, num3])
(因为常量过多所以啃汇编需要去掉大量的不必要信息,特别烦人)
要让它吐出s,我们首先就是要拿到str:
def decode(s):
ret = ""
for i in range(0, len(s), 3):
num1 = (s[i] << 3) + (s[i + 1] >> 3)
num2 = ((s[i + 1] & 7) << 4) + s[i + 2]
ret += chr(num1) + chr(num2)
return ret
coded_str = [[12, 22, 1], [12, 14, 2], [12, 22, 3], [12, 30, 2], [12, 22, 4, 12, 30, 1], [12, 22, 1, 12, 30, 4],
[12, 22, 2, 12, 22, 2], [12, 22, 2, 12, 22, 2]]
for i in range(len(coded_str)):
print("str"+str(i+1)+" = \""+decode(coded_str[i])+"\"")
然后是借用str求num,这里直接照搬源码都没问题。接下来把所有的变量塞到空缺项里头就能得到flag了。