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}

posted @ 2024-04-12 00:47  zzkkk1h  阅读(165)  评论(0)    收藏  举报