[XCTF] reverse IgniteMe

下载附件,IDA打开,直奔main函数

如果输入的字符串不是'EIS{' 开头 '}'结尾,则退出

然后if ( sub_4011C0(Str) )则提示成功

进sub_4011C0()看一下

我们传入的字符串经过一系列处理之后要等于GONDPHyGjPEKruv{{pj]X@rF

如果字符区间为[97,122],则通过f(x)=x-32映射到值域[65,90]

如果字符区间为[65,90],则通过f(x)=x+32映射到值域[97,122]

那么我们就可以通过字符的ascii值确定还原函数了。

然后再做一个 Str2[i] = word_4420B0[i] ^ sub_4013C0(v8[i]); 变换

word_4420B0为一个数组,sub_4013C0为一个函数,v8[i]是我们刚刚有映射处理的结果

shift+e导出word_4420B0数组

 sub_4013C0()函数

 

 写python脚本复原

s = 'GONDPHyGjPEKruv{{pj]X@rF'
result = ''
word = ('\r',
        '\x13',
        '\x17',
        '\x11',
        '\x02',
        '\x01',
        ' ',
        '\x1D',
        '\f',
        '\x02',
        '\x19',
        '/',
        '\x17',
        '+',
        '$',
        '\x1F',
        '\x1E',
        '\x16',
        '\t',
        '\x0F',
        '\x15',
        '\'',
        '\x13',
        '&',
        '\n',
        '/',
        '\x1E',
        '\x1A',
        '-',
        '\f',
        '\"',
        '\x04')


def check(c, i):
    if 97 <= c <= 122:
        c -= 32
    elif 65 <= c <= 90:
        c += 32
    return ord(word[i]) ^ ((c ^ 0x55) + 72)


for i, si in enumerate(s):
    si = ord(si)
    for ci in range(32, 123):
        if check(ci, i) == si:
            result += chr(ci)
            break
print(result)
"""
wadx_tdgk_aihc_ihkn_pjlm
"""

flag为  EIS{wadx_tdgk_aihc_ihkn_pjlm}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值