Reverse
our-16bit-wars
下载一个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
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
有效的输入字符只有’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