当时弄了一会乱了,0节点啥都没有,昨天看了官方WP发现需要把全部的节点弄出来。试了一成功,就差一点呀。
不过官方给出了密钥 0xdeadbeef程序里是没有的,而且我的作的时候也是爆密钥。先看下加密程序
__int64 __fastcall crypto(__int64 a1, int a2)
{
int i; // [rsp+10h] [rbp-10h]
int v4; // [rsp+14h] [rbp-Ch]
_BYTE *v5; // [rsp+18h] [rbp-8h]
v4 = sub_30A3();
for ( i = 0; i < a2; ++i )
{
v5 = (_BYTE *)(i + a1);
*v5 = (*v5 >> 1) | (*v5 << 7);
*v5 ^= v4;
*v5 = ((unsigned __int8)*v5 >> 2) | (*v5 << 6);
*v5 ^= BYTE1(v4);
*v5 = ((unsigned __int8)*v5 >> 3) | (32 * *v5);
*v5 ^= BYTE2(v4);
*v5 = ((unsigned __int8)*v5 >> 4) | (16 * *v5);
*v5 ^= HIBYTE(v4);
*v5 = (*v5 >> 5) | (8 * *v5);
}
return 0LL;
}
按字节加密,在5次循环移位中间加了密钥,其实这种密钥再大也就是256个
a0 a1 a2 a3 a4 a5 a6 a7
a7 a0 a1 a2 a3 a4 a5 a6
b10 b11 b12 b13 b14 b15 b16 b17
a5 a6 a7 a0 a1 a2 a3 a4
b16 b17 b10 b11 b12 b13 b14 b15
b20 b21 b22 b23 b24 b25 b26 b27
a2 a3 a4 a5 a6 a7 a0 a1
b13 b14 b15 b16 b17 b10 b11 b12
b25 b26 b27 b20 b21 b22 b23 b24
b30 b31 b32 b33 b34 b35 b36 b37
a6 a7 a0 a1 a2 a3 a4 a5
b17 b10 b11 b12 b13 b14 b15 b16
b21 b22 b23 b24 b25 b26 b27 b20
b34 b35 b36 b37 b30 b31 b32 b33
b40 b41 b42 b43 b44 b45 b46 b47
a1 a2 a3 a4 a5 a6 a7 a0
b12 b13 b14 b15 b16 b17 b10 b11
b24 b25 b26 b27 b20 b21 b22 b23
b37 b30 b31 b32 b33 b34 b35 b36
b43 b44 b45 b46 b47 b40 b41 b42
从手工运算可以看到加密后的第0位是a1^b12^b24^b37^b43所有的b只跟a1作了运算,所以不管密钥是多少都只算1位。
解密(根据官方WP)先把所有的节点dump出来
from pwn import *
p = process(['./simplefs', 'image.flag', ' 500'])
context.log_level = 'debug'
menu = b' simplefs> '
p.sendlineafter(menu, b'mount')
for i in range(0,175):
p.sendlineafter(menu, f'copyout {i} {i}.dat'.encode())
p.sendlineafter(menu, b'quit')
第2步从这些加密数据里暴出带*ctf的
def xor(a, b):
return bytes([((i>>1|i<<7)&0xff)^b for i in a])
for i in range(175):
a = open(f'{i}.dat', 'rb').read()
for j in range(0x100):
b = xor(a, j)
if b'CTF{' in b:
print(i, b)
#22 b'*CTF{Gwed9VQpM4Lanf0kEj1oFJR6}\n'
是不是很easy,就是没想到它放的不是flag那个节点。笨!