nctf_2018 write up

发布于 2018-12-01  60 次阅读


Reverse

our-16bit-wars

download here

下载一个dos_box 跑一跑,发现是输入flag之后对flag进行操作,之后比较和加密的字符串是否相等 对于每一位字符p ((p>>3)^(p<<5))^0xff 与 数据表中的值相等 然后暴力枚举,爆破。

(这是char变量所以注意&0xff,不然数据溢出)

table=[0xC9, 0x68, 0x8A, 0xC8, 0x6F, 0x07, 0x6, 0xF, 0x7, 0xC6, 0xEB,0x86,0x6E,0x6E, 0x66, 0xAD, 0x4C, 0x8D, 0xAC, 0xEB, 0x26,0x6E, 0xEB, 0xCC, 0xAE, 0xCD, 0x8C, 0x86, 0xAD, 0x66, 0xCD,0x8E, 0x86, 0x8D, 0xAF]
ans=""
for i in range(0x23):
    for p in range(32,127):
        if ((p>>3)^(p<<5))&0xff==table[i]:
            ans+=chr(p)
            break
print(ans)

基本操作 Reverse Version

download here

ida得到加密算法

# 翻译的太丑  太丑
flag=""
s_change1=""
c=0
def change1(a):
    if a<64:
        v1=c
        c+=1
        s_change1[v1]=flag[a]
        change1(2*a+1)
        res=change1(2*(a+1))
    return res

对输入的字符串进行了一次先序遍历和一次中序遍历 出题人的意思应该是已知先序遍历和中序遍历求原二叉树。
却没想到原二叉树是个满二叉树,直接通过一种遍历方式就可以推出原二叉树 (或者是出题人发题之前把难度降低了嘤嘤嘤,出题人别捶我别捶我) 这里只给出用先序遍历求原二叉树的代码

#include<cstdio>
char str[] = "bcec8d7dcda25d91ed3e0b720cbb6cf202b09fedbc3e017774273ef5d5581794";
char p[65];
int cnt;
void fuck(int t){
    if(t >= 64) return;
    p[t] = str[cnt++];
    fuck(2 * t + 1);
    fuck(2 * (t + 1));
}

int main(){
    fuck(0);
    printf("%s",p);
}

Some Boxes

download here

有效的输入字符只有’4’,‘5’,‘W’,‘0’,读到这些字符的时候会对给定的一个字符数组进行修改。
正在用 ‘DFS’ 跑字符串,但是效率太低了,枚举到长度15以上的字符串就得跑好几个小时。 总觉得有高级做法……
最后发现了高级做法:推箱子游戏 ['W','5','4','0'] ['up','down','left','right'] s0:start a1:box1 a2:boxl2 14:target

08 08 08 08 08 08 08 08  08 08 08 08 08 08 08 08
08 08       08 08 08 08  08 08 08 08       08 08
08 08          a2    08                    08 08
08 08    08 08                 08 08 08       08
08 08    08 08    08 08        08 14          08
08 08       08           s0    08 08 08 08 08 08
08 08       08 08 08 08     08 08 08 08 08 08 08
08 08    08 08 08 08 08  a1 08 08          08 08
08       08 14 08    08              08    08 08
08                          08 08 08 08    08 08
08             08 08 08     08             08 08
08 08 08 08 08 08 08 08  08 08 08 08 08 08 08 08

走法:
WW44W444W45555555450050W0000WWWWW55555444444WWWWWWW000050050W4W0000W0550544


CTFer|NOIPer|CSGO|摸鱼|菜鸡