快速抵达
题目链接
STEP 00:题目用到的工具
- 系统:anhunsec_ctf_V2.0虚拟机(一个基于win11的高度定制化的用于CTF等用途的虚拟机镜像,包含了大多数常用的工具和kali 的WSL系统,具体功能详见暗魂攻防实验室(自用推荐,不引流~))
- 查壳工具: DIE
- 反编译程序: IDA
- Python
STEP 01:查壳和脱壳
我用的是 DIE ,一个全能并且UI比较现代化的查壳器,而且还有好多功能我没有发掘。
发现是是一个64为,用UPX加壳的应用,那就用命令脱壳吧,我发现用WSL的好处就是可以在本地文件夹直接运行linux命令,爽的雅痞!!!
STEP 02:反编译
IDA -> 新建工程->载入,不赘述了····
我去,这么多文件,直接暴力搜索吧,一般答案里面必定包含类似flag、congratulation之类的关键字。
欸嘿,还真有,F5转换成c代码看看
看样子重点应该在sub_4009AE(&v11),跳进去看看。
STEP 03:代码编写
这代码,要是一行行往回写,那可是够酸爽,但是一想,不对啊,题目的名字不应该是随便起的,re,对啊,我用正则不就很快吗!so,代码来了!
import re
strs = """if ( 1629056 * a1[0] != 166163712 )
if ( 6771600 * a1[1] != 731332800 )
if ( 3682944 * a1[2] != 357245568 )
if ( 10431000 * a1[3] != 1074393000 )
if ( 3977328 * a1[4] != 489211344 )
if ( 5138336 * a1[5] != 518971936 )
if ( 7532250 * a1[7] != 406741500 )
if ( 5551632 * a1[8] != 294236496 )
if ( 3409728 * a1[9] != 177305856 )
if ( 13013670 * a1[10] != 650683500 )
if ( 6088797 * a1[11] != 298351053 )
if ( 7884663 * a1[12] != 386348487 )
if ( 8944053 * a1[13] != 438258597 )
if ( 5198490 * a1[14] != 249527520 )
if ( 4544518 * a1[15] != 445362764 )
if ( 3645600 * a1[17] != 174988800 )
if ( 10115280 * a1[16] != 981182160 )
if ( 9667504 * a1[18] != 493042704 )
if ( 5364450 * a1[19] != 257493600 )
if ( 13464540 * a1[20] != 767478780 )
if ( 5488432 * a1[21] != 312840624 )
if ( 14479500 * a1[22] != 1404511500 )
if ( 6451830 * a1[23] != 316139670 )
if ( 6252576 * a1[24] != 619005024 )
if ( 7763364 * a1[25] != 372641472 )
if ( 7327320 * a1[26] != 373693320 )
if ( 8741520 * a1[27] != 498266640 )
if ( 8871876 * a1[28] != 452465676 )
if ( 4086720 * a1[29] != 208422720 )
if ( 9374400 * a1[30] != 515592000 )
if ( 5759124 * a1[31] != 719890500 )"""
pattern = r'\bif\s*\(\s*(\d+)\s*\*\s*a\d+\[\d+\]\s*!=\s*(\d+)\s*\)'
compile = re.compile(pattern)
data = compile.findall(strs)
flag_list = list()
for ll in data:
flag = int(ll[1]) // int(ll[0])
flag_list.append(chr(flag))
print(''.join(flag_list))
这里面的代码,为了便于正则识别我修改了一部分,比如*a 改成了a[0],最后一行改成了!=等
运行代码,结果为
flag{e65421110b0a3099a1c039337}
欢天喜地的去提交······
STEP 04:填坑
回去重新看看代码,好大的俩坑!!!
坑01:有5,有7,没有6
好家伙,我真的好家伙啊!这个坑只能暴力去填,最终试完缺的是1
坑02:次序颠倒
怎么这里还有坑啊!!!那就手动颠倒回来吧
最终的答案为
flag{e165421110ba03099a1c039337}
STEP 05:经验和教训
这道题虽然考研的是正则(自我感觉),但是还是在解体的时候去多看看内容,防止踩坑!
好了,就这样,继续做题去了·······