攻防世界ctf-1000click/crypt/happyctf

一、1000click

这题ida完发现有一千多个函数,本来以为会很难,结果实际上很简单。

首先进入ida,我的思路是,这么多函数显然直接分析代码有点困难了。然后就shift+F12,找字符串,我第一感觉是先找flag,搜索一下,放弃了

然后打开程序

显然点击1000次也是不现实的,没准1000次之后也没有flag,但是发现,check之后会有提示,如下

他有一个error的报错信息,然后我就想着去ida里面搜一下,发现位置,点进去

发现对应函数,进入

然后如下

发现判断函数,然后发现是判断与text比较,点进去text,发现一个flag,然后试了一下,发现对了,就结束了

小结

这题也算是给我一个新的经验了,对待程序类的题目,先根据程序里面的提示,去ida里面搜,直接看最后判断逻辑,没准就做出来了

二、crypt

这题,属实是折磨到我了。最开始我看就是对输入字符串进行一顿操作然后判断一下,这我熟悉啊,直接开始用python写脚本,后面发现越写越不对劲。先是拖进ida,找到main如下

很容易能发现sub140001120与sub140001140是关键函数,点进去发现如下

发现256这个数字,结合crypt这个标题,容易想到rc4这个算法,然后这个算法是对称加密算法(参考ctf-wiki)也就是有加密前或者加密后的字符串和key都可以解出对应的明文/密文

发现是rc4加密算法之后就简单了,根据上面main函数的最后部分,先得到加密的密文,然后找一个rc4解密脚本,就结束了,下面是我在ctf-wiki上找到的脚本,还挺好用的

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import base64
def rc4_main(key = "init_key", message = "init_message"):
print("RC4解密主函数调用成功")
s_box = rc4_init_sbox(key)
crypt = rc4_excrypt(message, s_box)
return crypt
def rc4_init_sbox(key):
s_box = list(range(256))
print("原来的 s 盒:%s" % s_box)
j = 0
for i in range(256):
j = (j + s_box[i] + ord(key[i % len(key)])) % 256
s_box[i], s_box[j] = s_box[j], s_box[i]
print("混乱后的 s 盒:%s"% s_box)
return s_box
def rc4_excrypt(plain, box):
print("调用解密程序成功。")
plain = base64.b64decode(plain.encode('utf-8'))
plain = bytes.decode(plain)
res = []
i = j = 0
for s in plain:
i = (i + 1) % 256
j = (j + box[i]) % 256
box[i], box[j] = box[j], box[i]
t = (box[i] + box[j]) % 256
k = box[t]
res.append(chr(ord(s) ^ k))
print("res用于解密字符串,解密后是:%res" %res)
cipher = "".join(res)
print("解密后的字符串是:%s" %cipher)
print("解密后的输出(没经过任何编码):")
return cipher
a=[188, 197, 18, 125, 133, 35, 132, 113, 123, 57, 40, 2, 211, 81, 243, 44, 137, 43, 166, 44, 175, 9] #cipher
key="12345678abcdefghijklmnopqrspxyz"
s=""
for i in a:
s+=chr(i)
s=str(base64.b64encode(s.encode('
utf-8')), 'utf-8')
rc4_main(key, s)

运行完就是flag:flag{nice_to_meet_you}

小结

这题主要的步骤应该是分析出是rc4加密算法,剩下的直接用脚本就行了

三、happyctf

这题做起来一点也不happy,刚下载附件的时候发现附带了一个pdb文件,对于从来没用过这个文件的我来说就直接战略性忽略了。但是后面才发现不带它直接分析是真滴折磨。完全不知道是干什么的。看了半天也不知道怎么做。最后加上了pdb,一下子就明朗了不少。至少知道了哪些函数是官方函数,是在干什么。

下面是主要思路,点进main如下

先是判断长度,需要长度为24才可以继续判断

这里很容易看明白,就是对输入逐字符进行操作,点进具体操作如下

就是将每个字符都与0x14异或一下,并push_back到v里面,也就是存入v,然后返回main

上面是关键部分,先将字符串存入key,然后也是逐字符进行操作,但是操作对象是v,也就是上面异或之后的字符,进行判断,而这里如果操作函数返回0则会错误,所以要返回1,点进操作函数

这里就是将key里面的字符与v9比较,不等则返回0,相等返回1. 而v9就是上面异或之后的字符

总结来说,就是将我们的输入异或0x14之后,与key比较,不相等则错误。也就是将key逐字符异或0x14就得到了flag,脚本如下:

1
2
3
4
5
6
7
x = list("rxusoCqxw{yqK`{KZqag{r`i")
flag = []
for i in range(0,24):
flag.append(chr(ord(x[i]) ^ 20))
flag_ = ''.join(flag)
print(flag_)
# flag如下 flag{Welcome_to_Neusoft}

四、总结

这上面三道题都对我来说有一定难度,但收获还是不小的。总结下来有下面几点:

  • gui类的题目,可以从中找到一些提示语句,然后直接去ida里面搜索对应语句,找到对应函数,直接进入核心判断逻辑语句

  • RC4的加解密题目,要关注256这个数字,如果有的话就要怀疑是不是RC4,是的话直接用已有的解密脚本做题

  • 如果附件带pdb一定要用,不然会很痛苦