encrypto

Posted by Humb1e on 2023-05-29
Estimated Reading Time 2 Minutes
Words 508 In Total
Viewed Times

2023上海赛初赛encrypto

挺抽象的,五道逆向,两道0解

另外两题都被干到50分了,还有这题400分左右的

ida打开一看是rust写的elf

反正rust一贯那么丑

image-20230529224819152

先看一眼这个,有很多库的调用,摆明了这是rust,然后乱点几个进去能看到time之类的系统调用

image-20230529224911249

还有这种对60,3600操作的很明显和时间挂钩的

image-20230529225020567

后面有起poll的,有点离谱

image-20230529225336169

还有给直接写明sha256字符串的。。

查了一下这个EVP_Q_digest大概是OpenSSL EVP的密码库用法,可以猜测出他调用了sha256加密

然后去瞄一眼给的flag.txt.enc

一看是68位的,这显然不是sha256直接加密的(不然也没法逆)

image-20230529230133338

后面一看这函数也蛮离谱的,就是一个rc4

image-20230529230158821

这样天才的赋初值方式。。

理论上动调一下,看一眼传入值的key是啥能做

咱也没装这些库,没法搞

随便猜猜是某个值的sha256加密后的结果传进来作为key(实际上是看官方wp的)

然后那个值也别管了,这函数都没输入,肯定和时间挂钩了,至于是什么关系呢?管他呢1-100000000随便爆吧

然后就有了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from hashlib import sha256

enc = [0xA2, 0x05, 0x05, 0xDB, 0x23, 0x11, 0x0E, 0x39, 0x46, 0x06, 0x0C, 0xD1, 0x91, 0xC6, 0x44, 0xE2,
0x1A, 0x9C, 0x61, 0xF1, 0xD3, 0xEB, 0x75, 0x3A, 0x81, 0x5D, 0xA2, 0x12, 0xB4, 0x58, 0x2A, 0xDB,
0x94, 0x14]

def rc4(data, key):
x = 0
box = list(range(256))
for i in range(256):
x = (x + box[i] + key[i % len(key)]) % 256
box[i], box[x] = box[x], box[i]
x = y = 0
out = bytearray()
for char in data:
x = (x + 1) % 256
y = (y + box[x]) % 256
box[x], box[y] = box[y], box[x]
out.append(char ^ box[(box[x] + box[y]) % 256])
return out

for i in range(100000):
k = sha256(str(i).encode()).digest()
d = rc4(enc, k)
if d[0] == ord('f') and d[1] == ord('l') and d[2] == ord('a'):
print(d.decode())
##flag{3df837d045ea07d9230cd23047a}

别说,flag瞬间就跑出来了。。。

我的评价是rust逆向就靠坑蒙拐骗猜,猜到就是赚到。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !