holy-grail-350-wp

0x00

image-20221116215150716

​ ELF类型的64位程序。

​ 找到其中有一个validChars函数。

image-20221116215150716

​ 可知输入字符串的每一个值c满足(c&0xDF-65)<=0x19 or c == 63

​ 还发现了一个函数stringMod,如下:

image-20221116225339699

​ 返回的值大于等于0,其实主要是让v4=0。这个函数的逻辑挺麻烦的,首先是固定字符串的第0、3、6、…、15位,然后对整个字符串异或,且要求异或后的字符串v5满足(v5[i*3]*v5[i*3+1])%v5[i*3+2]=masterArray[i],同时还原后的字符串满足(c&0xDF-65)<=0x19 or c == 63。其中坑的一个点是:当找满足(v5[i*3]*v5[i*3+1])%v5[i*3+2]=masterArray[i]+v5[i*3+2]*k的k时,必须让k足够大,否则就会得到flag:tuctf{AfXXXanOrEuropean?},实际上flag是tuctf{AfricanOrEuropean?}

​ 其实这个题挺费时间的,中间踩了许多坑,例如知识点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
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
# @Time : 2022/11/17 14:49:27
# @Author: wd-2711
'''

# 代表 masterArray
aa = [0x000001D7, 0x0000000C, 0x00000244, 0x0000025E, 0x00000093, 0x0000006C]

# 代表 thirdchar
bb = [0x000002EF, 0x000002C4, 0x000002DC, 0x000002C7, 0x000002DE, 0x000002FC, 0x00000000, 0x00000000]

# 代表v5[0], v5[3], ..., v5[15]
cc = [731, 712, 713, 746, 727, 734]

v7 = [666, 667, 669, 673, 676, 677, 679, 683, 686, 687, 689, 693, 696, 697, 699, 703, 706, 707]

dd = []
for ii in range(6):
for i in range(200, 10000):
if (i * bb[ii] + aa[ii]) % cc[ii] == 0:
tmp1 = (i * bb[ii] + aa[ii]) // cc[ii]
tmp2 = tmp1 ^ v7[ii*3+1]
if (tmp2 & 0xdf) - 65 <= 0x19 or tmp2 == 63:
print('v5[{}] is {}'.format(ii*3+1,(i * bb[ii] + aa[ii]) // cc[ii]))
dd.append((i * bb[ii] + aa[ii]) // cc[ii])
break

v5 = []
for i in range(6):
v5.append(cc[i])
v5.append(dd[i])
v5.append(bb[i])

for i in range(18):
v5[i] ^= v7[i]

print("tuctf{", end = "")
for i in v5:
print(chr(i & 0xff), end = "")
print("}", end = "")

0x01

​ 看了其他师傅的wp基本都是这么做的。

知识点1:

1
2
3
4
do{
// do something
}
while(condition)
1
2
3
while(True):
# do something
if condition: break

上述两个例子等价。

知识点2:

​ C/C++中的int类型为4字节。

留言

2022-11-16

© 2024 wd-z711

⬆︎TOP