>
>
xctf-高校战疫-Re-fxck!
Frank
先看大致流程:flag->preprocess->check
preprocess(char *flag, int len, char *processed)
等价代码:
https://paste.ubuntu.com/p/Xsv3ZvVqgm/
or
https://paste.ubuntu.com/p/5yJgWZszbt/
通过flag生成一个新的字符串processed,送进下面的函数进行check
check(const char *processed)
由于没有看到公告,下载最新的附件,我在check的那个switch的状态机那块纠结了许久。。
更新附件后processed可以直接通过调试在strcmp
那里dump出来,不用看这一部分。
但是我还是写一下用旧的二进制怎么推出processed吧
op代表这个FSM的转移方式
check函数中构造的
jump_table在下面的状态机中的作用是连接不相邻的两个状态,在op为221与253时会转移到jump_table指定的状态
而不难发现,jump_table的值是定值
(有点像无向图的连图
如果学过OI可以差分得到processed初始值。
op[196] processed[cur]++, rev(res[cur]--)
op[197] processed[cur]--, rev(res[cur]++)
op[168] cur++, rev(cur--)
op[169] cur--, rev(cur++)
op[221] if(!processed[cur])jump(jump_table[cur])
op[253] jump(jump_table[cur]-1)
op[1] assert(processed[cur]==res[i++])
得到processed值为:
4VyhuTqRfYFnQ85Bcw5XcDr3ScNBjf5CzwUdWKVM7SSVqBrkvYGt7SSUJe
正解
https://paste.ubuntu.com/p/HzGNwQ232s/
爆破:
正向爆破也是可行的,只是字符集里头忘了加-所以没爆出来
https://paste.ubuntu.com/p/RDZZh54yxD/
yuchoxuuan
真·大佬。。
佩服佩服
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论