抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

landing

F|landing|1ens看main函数汇编界面,发现异常处理,修改汇编发现真正逻辑,调试提取数据img

nothing函数有一个简单的花指令

image-20220920211624057

去除之后是一个base64变体,注意第三十行的加一,然后就是解密:

img

cbNET

.NET文件

image-20220920212446347

加了壳和混肴

[分享]ConfuserEx1.0-加壳脱壳-看雪论坛-安全社区|安全招聘|bbs.pediy.com

用ConfuserEx和de4dot脱壳去除混肴得到最后的文件

PS:一开始没注意到Confuser那层壳,调试文件

image-20220920213520883

main函数的arry2是一个exe文件(开头是MZ,dump出来,再用de4dot去除混肴。

image-20220920213333881

主逻辑在GClass1里

加密0是一个简单的异或

image-20220920213731959

加密一是判断素数

image-20220920213815460

加密二是一个goto构成的较为复杂的未知加密,

image-20220920213908904

最后的比较

image-20220920214250539

大致算法如此

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

def isPrime(n):# 判断n是否为质数
if n < 2:
return 0
for i in range(2, n - 1):
if n % i == 0:
return 0
return 1
for num2 in range(len(input)):# input为第一个函数异或加密后的数组
try:
input(num2) = (input(num2) ^ (input(i - 1) // (num2 % 8))) + input(num2 - 1) % (num2 % 8)
except:
input(num2) = (input(num2) ^ (input(i + 7) // 8)) + input(num2 + 7) % 8


input(num2) = input(num2) - 2 - (input(num2) % 2)
for j in range(2,input(num2) - 1):
if isPrime(j) and isPrime(input(num2) - j):
input(i) = j * (input(num2) - j)

由于最后一步将原来的数减2或者减3(取决于原来的数是奇数还是偶数)之后分解为两个质数和,原来的数会有奇数和偶数两种情况的存在,所以最后的逆向脚本需要进行递归爆破

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
import hashlib


def isPrime(n):
if n < 2:
return 0
for i in range(2, n - 1):
if n % i == 0:
return 0
return 1


def xordecrypt(key):
str = "0rays"
circle = 0
flag = ""
for i in range(len(key)):
flag = flag + chr(key[i] ^ ord(str[circle]))
circle = (circle + 1) ^ 5
flag = "CBCTF{" + flag + "}"
t = hashlib.sha256()
t.update(flag.encode())
finalflag = t.hexdigest()
if finalflag == "15c4ac7645546a1ef8141441b48e1824954fdbb159bf96400061b17db1af9edf":
print(flag)
exit(0)


def recursion(key2, i):
key = key2.copy()
if (i % 8) != 0:
key[i] = (key[i] - key[i - 1] % (i % 8)) ^ (key[i - 1] // (i % 8))
else:
key[i] = (key[i] - key[i + 7] % 8) ^ (key[i + 7] // 8)
if i != 0:
decrypt(key, i - 1)
else:
xordecrypt(key)


def decrypt(key1, i):
key = key1.copy()
for j in range(2, key[i] - 2):
if key[i] % j == 0 and isPrime(j) and isPrime(key[i] // j):
key[i] = j + key[i] // j
break
key[i] = key[i] + 2
recursion(key, i)
key[i] = key[i] + 1
recursion(key, i)


key = [309, 1981, 2823, 6979, 28339, 39487, 33035, 283711, 623, 4109, 23551, 54761, 67985, 231149, 499603, 1354567, 213,
2651, 22559, 52549, 484663, 290793, 532213, 1746643]
decrypt(key, 23)

得到flag CBCTF{Vb_1s_SucH_An_e4sY_w0rk1}

评论