>
>
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
真·大佬。。
佩服佩服
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论