buuctf-reverse-[GUET-CTF2019]re
先用Exeinfo PE扫一遍

发现upx壳,使用官方upx脱壳命令 upx -d re,成功脱壳
载入ida分析,shift+F12查找字符串,尝试在字符串窗口中搜索flag

点进这个 input your flag:
ctrl+x查看交叉引用(或者双击DATA XREF后边的地址)

找到引用这个字符串的汇编代码,双击进入,按F5反编译

找到关键判断函数,点进去看看

之后可以复制代码手动求解;
也可以用z3约束器求解 参见:https://blog.csdn.net/Palmer9/article/details/104210881
这里使用正则表达式提取数字,进行运算,代码如下
import re
data='''
if (1629056 * a1[0] != 166163712)
return 0LL;
if (6771600 * a1[1] != 731332800)
return 0LL;
if (3682944 * a1[2] != 357245568)
return 0LL;
if (10431000 * a1[3] != 1074393000)
return 0LL;
if (3977328 * a1[4] != 489211344)
return 0LL;
if (5138336 * a1[5] != 518971936)
return 0LL;
if (7532250 * a1[7] != 406741500)
return 0LL;
if (5551632 * a1[8] != 294236496)
return 0LL;
if (3409728 * a1[9] != 177305856)
return 0LL;
if (13013670 * a1[10] != 650683500)
return 0LL;
if (6088797 * a1[11] != 298351053)
return 0LL;
if (7884663 * a1[12] != 386348487)
return 0LL;
if (8944053 * a1[13] != 438258597)
return 0LL;
if (5198490 * a1[14] != 249527520)
return 0LL;
if (4544518 * a1[15] != 445362764)
return 0LL;
if (3645600 * a1[17] != 174988800)
return 0LL;
if (10115280 * a1[16] != 981182160)
return 0LL;
if (9667504 * a1[18] != 493042704)
return 0LL;
if (5364450 * a1[19] != 257493600)
return 0LL;
if (13464540 * a1[20] != 767478780)
return 0LL;
if (5488432 * a1[21] != 312840624)
return 0LL;
if (14479500 * a1[22] != 1404511500)
return 0LL;
if (6451830 * a1[23] != 316139670)
return 0LL;
if (6252576 * a1[24] != 619005024)
return 0LL;
if (7763364 * a1[25] != 372641472)
return 0LL;
if (7327320 * a1[26] != 373693320)
return 0LL;
if (8741520 * a1[27] != 498266640)
return 0LL;
if (8871876 * a1[28] != 452465676)
return 0LL;
if (4086720 * a1[29] != 208422720)
return 0LL;
if (9374400 * a1[30] == 515592000)
return 5759124 * a1[31] == 719890500;
return 0LL;
'''
flag=""
a = re.findall('(\d+) \* a1\[\d+\] [!=]= (\d+)',data)
a[15],a[16]=a[16],a[15]
for i in range(0,31):
if(i==6):
flag+='?'
flag+=chr(int(a[i][1])//int(a[i][0]))
print(flag)
# flag ="flag{e?65421110ba03099a1c039337}"
注意a1[6]未给出,a1[17]与a1[16]位置颠倒
然后对flag[6]进行爆破,当提交flag[6]='1'时,成功通过
flag{e165421110ba03099a1c039337}

浙公网安备 33010602011771号