[*ctf 2022 reverse] simplefs

当时弄了一会乱了,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那个节点。笨!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值