HBCTF02

这个周五的晚上开始的HBCTF,由于出题人比较忙碌,所以只出了一些较为简单的题目(?)

HBCTF02

Misc 30

这题下载下来就是一张图片:

binwalk处理后得到内部存在另一个文本:

使用以下指令:

解压后得到文本bug0u},发现这里好像只有一半的内容,另一半在哪里呢?我们用
stegsolve检查一下图片:

最后在蓝通道中找到了这段文字。

Reverse 100

首先查看代码对读入的处理逻辑(听说有些人不能f5处理,但是我这边比较幸运)

这个a2就是我们读入的字符串。注意几个坑人的地方:看到上面的红色线框的位置, flag这个变量阻止我们进入的逻辑中,存在将我们的输入^0x14后存放到b数组的逻辑中。然而我们可以看下一段check内容:

从这里可以看出,我们的check逻辑是将b的内容进行比较。如果我们前面没有能够成功赋值的话,我们此时b中的内容将一直是’ ‘,显然是错误的。所以我们需要在动态调试的过程中将这个flag改成1(马上有第二个坑)。
继续看上面那幅图,会注意到我们的随机数种子是固定的,都是srand(0xc),也就是说,随机数的生成时固定的。因此我们可以在动态调试的过程中将我们需要得到的字符串暴力破解出来:

最后注意到,这段并不是密码。我们在

中的第二个红框中存在第二个坑:此时的flag不能是1,要重新改回0,才会进入第二个判断语句。并且这里将变量c中的内容输出:

最终会得到:

Crypto 40

这个题目我觉得还是有很大的脑洞成分在里面的。。。

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
# -*- coding:utf8 -*-
# 使用windows系统
from random import *
def mix():
mixed_flag='没有告诉我们'
seed("www.ChaMd5.org")
out=''
assert randrange(0,100)==78
for c in mixed_flag:
if c.islower():
out+= chr((ord(c)-0x61+randrange(0,26))%26 + 0x61)
elif c.isupper():
out+= chr((ord(c)-0x41+randrange(0,26))%26 + 0x41)
elif c.isdigit():
out+= chr((ord(c)-0x30+randrange(0,10))%10 + 0x30)
else:
out+= c
# print(out)
print out
#输出是 SACBK8AEJCAOW52YL9ANBO7PQ0YvrEajcxnu7784704595388694801
pass
if __name__ == '__main__':
mix()

同样的,额也是因为没有设置随机数种子导致的随机数不随机。那么其实我们只要稍微改一下代码就能够得到答案:

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
# -*- coding:utf8 -*-
# 使用windows系统
from random import *
def mix():
# mixed_flag='SACBK8AEJCAOW52YL9ANBO7PQ0YvrEajcxnu7784704595388694801'
seed("www.ChaMd5.org")
out=''
assert randrange(0,100)==78
for c in mixed_flag:
if c.islower():
out+= chr((ord(c)-0x61-randrange(0,26)+26)%26 + 0x61)
elif c.isupper():
out+= chr((ord(c)-0x41-randrange(0,26)+26)%26 + 0x41)
elif c.isdigit():
out+= chr((ord(c)-0x30-randrange(0,10)+10)%10 + 0x30)
else:
out+= c
# print(out)
print out
#输出是 'NBRGG5DGPNRGC43FL5XGSY3FX2FueGlhbmdf8316025876259956605'
pass
if __name__ == '__main__':
mix()

然后,这一题没这么简单。。。。仔细看密码最后一段,发现是16进制编码,得到答案:
shuiying}
前面一整段强行base64解码后,会发现中间那段是base64处理后字符串:
anxiang
最前面那段想了很久,发现只有大写字母和一些数字,于是猜测base32:
hbctf{base_nice
最终得到flag
hbctf{base_nice_anxiang_shuiying}

Misc 40

首先我们发现这个zip文件也是加密的zip:

我们使用ZipCenOp这个软件进行伪加密的解密处理后,发现文件被损坏。说明此时的确是存在密码的。然后我们发现这个压缩包里面并不是所有文件都是获取不到的:

这个BurpLoader应该是可以从网上下载到的,这个文件其实是BurpSuite破解版使用的载入程序。加上题目中有提升到说,要从指定的网站下burpsuite。于是这里将那个位置上下载burpsuite后,将文件目录组织如下:
文件夹
|– BurpLoader
然后将文件夹整个压缩成压缩包。
最后使用神奇AZRP中的plain-text的选择明文攻击,分别填写文件目录:

最后按下start、就可以进行选择明文破解。之后会让我们选择将解压后的文件的存放位置,我们就能够得到解药后的zip了。

Crypto 100

这是一个RSA,文件内容如下:

1
2
3
4
5
c:0x258f85f5d08a95a909a4d9a4c66bf4249fba21091ddfe9fcfcd33c9f4cf285af9eb99c77f839a1a7ee7791c1e98f023adf3b02561a8c45e651f1984852b9a0280e24bee7bd4fc95d217b874f135e693f748d7b
n:0x27335d21ca51432fa000ddf9e81f630314a0ef2e35d81a839584c5a7356b94934630ebfc2ef9c55b111e8c373f2db66ca3be0c0818b1d4eda7d53c1bd0067f66a12897099b5e322d85a8da45b72b828813af23
p>q
dp:0x40dadac6db130c9b1a33bab328dc7335220e0e1ec26cc03bf405211013cdb500a70d1a619565f2c0aaf
dq:0x2f1af91dc6ae2abba0a0b7cb4bf1a6361157f39b06bb3b17c2ce6b208aa0b5be634922a7ccfcfc586c5

这里比较头疼的是这个dp和dq。n完全可以使用各种花式网站分解成p和q,然后我们会发现,此时我们不知道e或者d,导致我们没办法解密。晚上一着急没想到要去google找,后来找到的内容如下:

1
2
dp = d mod p - 1(dP = (1/e) mod (p-1))
dq = d mod q - 1(dQ = (1/e) mod (q-1))

换句话说,我们这里可以利用p和q快速的找到d!
首先上网址大素数分解,得到p和q:

1
2
3
4
p = 3423616853305296708261404925903697485956036650315221001507285374258954087994492532947084586412780871
q = 3423616853305296708261404925903697485956036650315221001507285374258954087994492532947084586412780869
```
然后可以上网找到这类算法的快速解法:

qInv = (1/q) mod p
m1 = cdP mod p (c^(1/e) mod p)
m2 = cdQ mod q (c^(1/e) mod q)
h = qInv.(m1 - m2) mod p
m = m2 + h.q
```
快速的写一个脚本解决好了:

这种数学的东西。。。看的脑大。。。