-
-
[原创]CTF2019-Q3- 第三题:庄周梦蝶 设计思路
-
发表于: 2019-8-9 15:31 3243
-
战队名称:兔斯基保护协会
参赛题目:基因编辑(Gene Hacking)
题目答案:
45621456375897443042931429304290
crackme程序见附件
题目设计:
(如有需要,可以联系我提供源代码)
本题的设计理念是题目即游戏。游戏分为两关,不同答案会根据通关情况给出不同的反馈,从而降低玩家的枯燥感。
正确序列号可以通过两关,程序显示:Right! You are very clever!
不正确但过了第一关,程序显示:Wrong! You are close to the result!
一关都没过,程序显示:Wrong!
第一关直接可以得到32的字节的key,不过这个key恐怕在小范围内有多解的可能,所以再由第二关从第一关的解中筛选中正确的唯一解。
(如果最终多解,我女装自拍发到比赛群里)
第一关:
本题限定用户的正确输入必须是正好32个字节。
本人搞了包含10个指令的指令集,把用户的输入转换为指令序列,然后开始跑如下程序:
void Sort()
{
int loop = 1;
LOOP: // 第一层循环
g_i = 1;
while (g_i < g_a_count) // 第二层循环
{
int pos = 0;
while (pos < 32)
{
跑用户指令
}
}
loop = (loop + 1) % 128;
if (loop)
goto LOOP;
}
这个程序就是个排序算法,排序需要的两层循环都已经限定死了,用户只需要填充每次比较和交换的逻辑即可。
我会用256位乱序数据来测试排序算法的有效性。
由于指令集非常基础而繁琐,用户所能达成目的有需要在32个字节之内,所以用户几乎只能使用冒泡算法:
void DefaultSort()
{
两层循环
{
// user code starts
if (g_box[g_a[i]] > g_box[g_a[i + 1]])
{
int temp = g_a[i];
g_a[i] = g_a[i + 1];
g_a[i + 1] = temp;
}
// user code ends
}
}
一种巧妙压缩后的算法如下:(正好32字节,不需要空操作,我本人没有想到更短的写法)
F代表指令集解释函数,只支持10种指令。
void Sort()
{
int loop = 1;
LOOP:
g_i = 1;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-9-25 10:38
被kanxue编辑
,原因:
赞赏
他的文章
谁下载
无
看原图
赞赏
雪币:
留言: