CTF学习小记 [GUET-CTF2019]re(正则解法)

题目链接

[GUET-CTF2019]re

STEP 00:题目用到的工具

  1. 系统:anhunsec_ctf_V2.0虚拟机(一个基于win11的高度定制化的用于CTF等用途的虚拟机镜像,包含了大多数常用的工具和kali 的WSL系统,具体功能详见暗魂攻防实验室(自用推荐,不引流~))
  2. 查壳工具: DIE
  3. 反编译程序: IDA
  4. 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:经验和教训

这道题虽然考研的是正则(自我感觉),但是还是在解体的时候去多看看内容,防止踩坑!

好了,就这样,继续做题去了·······

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值