首页
社区
课程
招聘
[原创]kctf2021 第四题 英雄救美
2021-5-17 22:21 5944

[原创]kctf2021 第四题 英雄救美

2021-5-17 22:21
5944

载入IDA,这里对输入进行了三个判断,长度是否大于64,是否是特定数组中的字符,是否符合数组。

1
2
3
4
5
6
7
# 特定数组
inum = [0x24, 0x42, 0x50, 0x56, 0x3A, 0x75, 0x62, 0x66, 0x59, 0x70, 0x7D, 0x5D, 0x44, 0x74, 0x4E, 0x3E,
        0x61, 0x54, 0x5E, 0x4D, 0x47, 0x6D, 0x4A, 0x51, 0x23, 0x2A, 0x48, 0x72, 0x60, 0x4F, 0x27, 0x77,
        0x6A, 0x69, 0x63, 0x30, 0x21, 0x68, 0x64, 0x79, 0x7B, 0x6F, 0x5A, 0x7A, 0x2D, 0x40, 0x6E, 0x2B,
        0x3F, 0x26, 0x25, 0x73, 0x5F, 0x2F, 0x67, 0x3C, 0x65, 0x5B, 0x57, 0x29, 0x58, 0x55, 0x78, 0x52,
        0x46, 0x53, 0x4C, 0x52, 0x41, 0x3B, 0x2E, 0x6C, 0x3D, 0x43, 0x45, 0x6B, 0x76, 0x4B, 0x2D, 0x28
]

取出在数组中的位置,进行如下操作,存入二维数组,判断是否为符合数独

 

1
2
3
4
5
6
7
8
9
10
11
# 原数独数组
map = [0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07,
       0x08, 0x03, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00,
       0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00,
       0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x07, 0x01,
       0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00
]

使用脚本求出数独

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import datetime
class solution(object):
    def __init__(self,board):
        self.b = board
        self.t = 0
 
    def check(self,x,y,value):
        for row_item in self.b[x]:
            if row_item == value:
                return False
        for row_all in self.b:
            if row_all[y] == value:
                return False
        row,col=x/3*3,y/3*3
        row3col3=self.b[row][col:col+3]+self.b[row+1][col:col+3]+self.b[row+2][col:col+3]
        for row3col3_item in row3col3:
            if row3col3_item == value:
                return False
        return True
 
    def get_next(self,x,y):
        for next_soulu in range(y+1,9):
            if self.b[x][next_soulu] == 0:
                return x,next_soulu
        for row_n in range(x+1,9):
            for col_n in range(0,9):
                if self.b[row_n][col_n] == 0:
                    return row_n,col_n
        return -1,-1 
 
    def try_it(self,x,y):
        if self.b[x][y] == 0:
            for i in range(1,10):
                self.t+=1
                if self.check(x,y,i):
                    self.b[x][y]=i
                    next_x,next_y=self.get_next(x,y)
                    if next_x == -1: #
                        return True  #
                    else:       
                        end=self.try_it(next_x,next_y)
                        if not end:   #
                            self.b[x][y] = 0    #
                        else:
                            return True
 
    def start(self):
        begin = datetime.datetime.now()
        if self.b[0][0] == 0:
            self.try_it(0,0)
        else:
            x,y=self.get_next(0,0)
            self.try_it(x,y)
        for i in self.b:
            print i
        end = datetime.datetime.now()
        print '\ncost time:', end - begin
        print 'times:',self.t
        return
 
 
s=solution(
       [[0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00],
       [0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07],
       [0x08, 0x03, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00],
       [0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00],
       [0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00],
       [0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00],
       [0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x07, 0x01],
       [0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04],
       [0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00]]
       )
s.start()

得到的正确数独为

1
2
3
4
5
6
7
8
9
map = [ [5, 4, 6, 7, 1, 9, 2, 3, 8]
        [9, 2, 1, 8, 3, 4, 6, 5, 7]
        [8, 3, 7, 6, 2, 5, 4, 1, 9]
        [7, 1, 8, 4, 6, 3, 9, 2, 5]
        [4, 5, 3, 2, 9, 1, 7, 8, 6]
        [6, 9, 2, 5, 8, 7, 1, 4, 3]
        [2, 8, 4, 9, 5, 6, 3, 7, 1]
        [3, 6, 5, 1, 7, 2, 8, 9, 4]
        [1, 7, 9, 3, 4, 8, 5, 6, 2] ]

按照空的顺序打印出字符串即可,每行后加上没有输入的位数。

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
42
43
inum = [0x24, 0x42, 0x50, 0x56, 0x3A, 0x75, 0x62, 0x66, 0x59, 0x70, 0x7D, 0x5D, 0x44, 0x74, 0x4E, 0x3E,
        0x61, 0x54, 0x5E, 0x4D, 0x47, 0x6D, 0x4A, 0x51, 0x23, 0x2A, 0x48, 0x72, 0x60, 0x4F, 0x27, 0x77,
        0x6A, 0x69, 0x63, 0x30, 0x21, 0x68, 0x64, 0x79, 0x7B, 0x6F, 0x5A, 0x7A, 0x2D, 0x40, 0x6E, 0x2B,
        0x3F, 0x26, 0x25, 0x73, 0x5F, 0x2F, 0x67, 0x3C, 0x65, 0x5B, 0x57, 0x29, 0x58, 0x55, 0x78, 0x52,
        0x46, 0x53, 0x4C, 0x52, 0x41, 0x3B, 0x2E, 0x6C, 0x3D, 0x43, 0x45, 0x6B, 0x76, 0x4B, 0x2D, 0x28,
        0x71 ]
map = [0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07,
       0x08, 0x03, 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00,
       0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00,
       0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x07, 0x01,
       0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, 0x04,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00
       ]
map1 = [
    5, 4, 6, 7, 1, 9, 2, 3, 8,
    9, 2, 1, 8, 3, 4, 6, 5, 7,
    8, 3, 7, 6, 2, 5, 4, 1, 9,
    7, 1, 8, 4, 6, 3, 9, 2, 5,
    4, 5, 3, 2, 9, 1, 7, 8, 6,
    6, 9, 2, 5, 8, 7, 1, 4, 3,
    2, 8, 4, 9, 5, 6, 3, 7, 1,
    3, 6, 5, 1, 7, 2, 8, 9, 4,
    1, 7, 9, 3, 4, 8, 5, 6, 2,
]
count = 0
contl = 0
for i in range(len(map)):
    if map[i] != map1[i]:
        for j in range(contl,len(inum)):
            if inum[j] != 0 and (j%9+1) == map1[i]:
                # print(j)
                print(chr(inum[j]),end="")
                count += 1
                inum[j] = 0
                break
    if i % 9 == 8:
        print(str(hex(9 - count))[2:],end="")
        contl += 9
        count = 0
# :u$YBPf2pa]Dt4#QM^H4ic'j0`w2y{d-Zzo2%/n_s@+2<UW)e4AR;F.4=-qEkvC2

之后的逻辑为:求出其MD5值,利用这个MD5对后面代码进行解密,只有正确的MD5才会是程序正确运行形式为,


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-5-18 11:05 被kanxue编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回