moeCTF20221114

Juana_2u 记录来时的路

REVERSE

checkin

直接先查壳放入64位的ida中,找相应的flag
moectf{Enjoy_yourself_in_Reverse_Engineering!!!}

begin

查看程序信息之后用ida64位打开,F5查看主函数
image.png
读伪代码,发现是输入的Str内容进行与0x19异或之后与最后的Str2的内容进行对比,打开的Str2的密文:
image.png
导出数据shift+e,进行异或脚本:

1
2
3
4
5
6
7
8
9
str2 = [116, 118, 124, 122, 109, 127,  98,  65,  41, 107, 
70, 40, 106, 70, 106, 41, 70, 112, 119, 109,
42, 107, 42, 106, 109, 112, 119, 126, 56, 56,
56, 56, 56, 100]
flag = ""
for i in range(len(str2)):
flag+=chr(str2[i]^0x19)
print(flag)
## moectf{X0r_1s_s0_int3r3sting!!!!!}

EquationPy

一看就是python的逆向,用uncompyle6或者用的在线的网站(python反编译 )先进行反编译
反编译出的python代码如下

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
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.8

print('Maybe z3 can help you solve this challenge.')
print('Now give me your flag, and I will check for you.')
flag = input('Input your flag:')
if len(flag) == 22
and ord(flag[0]) * 7072 + ord(flag[1]) * 2523 + ord(flag[2]) * 6714 + ord(flag[3]) * 8810 + ord(flag[4]) * 6796 + ord(flag[5]) * 2647 + ord(flag[6]) * 1347 + ord(flag[7]) * 1289 + ord(flag[8]) * 8917 + ord(flag[9]) * 2304 + ord(flag[10]) * 5001 + ord(flag[11]) * 2882 + ord(flag[12]) * 7232 + ord(flag[13]) * 3192 + ord(flag[14]) * 9676 + ord(flag[15]) * 5436 + ord(flag[16]) * 4407 + ord(flag[17]) * 6269 + ord(flag[18]) * 9623 + ord(flag[19]) * 6230 + ord(flag[20]) * 6292 + ord(flag[21]) * 57 == 10743134
and ord(flag[0]) * 3492 + ord(flag[1]) * 1613 + ord(flag[2]) * 3234 + ord(flag[3]) * 5656 + ord(flag[4]) * 9182 + ord(flag[5]) * 4240 + ord(flag[6]) * 8808 + ord(flag[7]) * 9484 + ord(flag[8]) * 4000 + ord(flag[9]) * 1475 + ord(flag[10]) * 2616 + ord(flag[11]) * 2766 + ord(flag[12]) * 6822 + ord(flag[13]) * 1068 + ord(flag[14]) * 9768 + ord(flag[15]) * 1420 + ord(flag[16]) * 4528 + ord(flag[17]) * 1031 + ord(flag[18]) * 8388 + ord(flag[19]) * 2029 + ord(flag[20]) * 2463 + ord(flag[21]) * 32 == 9663091
and ord(flag[0]) * 9661 + ord(flag[1]) * 1108 + ord(flag[2]) * 2229 + ord(flag[3]) * 1256 + ord(flag[4]) * 7747 + ord(flag[5]) * 5775 + ord(flag[6]) * 5211 + ord(flag[7]) * 2387 + ord(flag[8]) * 1997 + ord(flag[9]) * 4045 + ord(flag[10]) * 7102 + ord(flag[11]) * 7853 + ord(flag[12]) * 5596 + ord(flag[13]) * 6952 + ord(flag[14]) * 8883 + ord(flag[15]) * 5125 + ord(flag[16]) * 9572 + ord(flag[17]) * 1149 + ord(flag[18]) * 7583 + ord(flag[19]) * 1075 + ord(flag[20]) * 9804 + ord(flag[21]) * 72 == 10521461
and ord(flag[0]) * 4314 + ord(flag[1]) * 3509 + ord(flag[2]) * 6200 + ord(flag[3]) * 5546 + ord(flag[4]) * 1705 + ord(flag[5]) * 9518 + ord(flag[6]) * 2975 + ord(flag[7]) * 2689 + ord(flag[8]) * 2412 + ord(flag[9]) * 8659 + ord(flag[10]) * 5459 + ord(flag[11]) * 7572 + ord(flag[12]) * 3042 + ord(flag[13]) * 9701 + ord(flag[14]) * 4697 + ord(flag[15]) * 9863 + ord(flag[16]) * 1296 + ord(flag[17]) * 1278 + ord(flag[18]) * 5721 + ord(flag[19]) * 5116 + ord(flag[20]) * 4147 + ord(flag[21]) * 52 == 9714028
and ord(flag[0]) * 2310 + ord(flag[1]) * 1379 + ord(flag[2]) * 5900 + ord(flag[3]) * 4876 + ord(flag[4]) * 5329 + ord(flag[5]) * 6485 + ord(flag[6]) * 6610 + ord(flag[7]) * 7179 + ord(flag[8]) * 7897 + ord(flag[9]) * 1094 + ord(flag[10]) * 4825 + ord(flag[11]) * 8101 + ord(flag[12]) * 9519 + ord(flag[13]) * 3048 + ord(flag[14]) * 3168 + ord(flag[15]) * 2775 + ord(flag[16]) * 4366 + ord(flag[17]) * 4066 + ord(flag[18]) * 7490 + ord(flag[19]) * 5533 + ord(flag[20]) * 2139 + ord(flag[21]) * 87 == 10030960
and ord(flag[0]) * 1549 + ord(flag[1]) * 8554 + ord(flag[2]) * 6510 + ord(flag[3]) * 6559 + ord(flag[4]) * 5570 + ord(flag[5]) * 1003 + ord(flag[6]) * 8562 + ord(flag[7]) * 6793 + ord(flag[8]) * 3509 + ord(flag[9]) * 4965 + ord(flag[10]) * 6111 + ord(flag[11]) * 1229 + ord(flag[12]) * 5654 + ord(flag[13]) * 2204 + ord(flag[14]) * 2217 + ord(flag[15]) * 5039 + ord(flag[16]) * 5657 + ord(flag[17]) * 9426 + ord(flag[18]) * 7604 + ord(flag[19]) * 5883 + ord(flag[20]) * 5285 + ord(flag[21]) * 17 == 10946682
and ord(flag[0]) * 2678 + ord(flag[1]) * 4369 + ord(flag[2]) * 7509 + ord(flag[3]) * 1564 + ord(flag[4]) * 7777 + ord(flag[5]) * 2271 + ord(flag[6]) * 9696 + ord(flag[7]) * 3874 + ord(flag[8]) * 2212 + ord(flag[9]) * 6764 + ord(flag[10]) * 5727 + ord(flag[11]) * 5971 + ord(flag[12]) * 5876 + ord(flag[13]) * 9959 + ord(flag[14]) * 4604 + ord(flag[15]) * 8461 + ord(flag[16]) * 2350 + ord(flag[17]) * 3564 + ord(flag[18]) * 1831 + ord(flag[19]) * 6088 + ord(flag[20]) * 4575 + ord(flag[21]) * 9 == 10286414
and ord(flag[0]) * 8916 + ord(flag[1]) * 8647 + ord(flag[2]) * 4522 + ord(flag[3]) * 3579 + ord(flag[4]) * 5319 + ord(flag[5]) * 9124 + ord(flag[6]) * 9535 + ord(flag[7]) * 5125 +ord(flag[8]) * 3235 + ord(flag[9]) * 3246 + ord(flag[10]) * 3378 + ord(flag[11]) * 9221 + ord(flag[12]) * 1875 + ord(flag[13]) * 1008 + ord(flag[14]) * 6262 + ord(flag[15]) * 1524 +ord(flag[16]) * 8851 + ord(flag[17]) * 4367 + ord(flag[18]) * 7628 + ord(flag[19]) * 9404 + ord(flag[20]) * 2065 + ord(flag[21]) * 9 == 11809388
and ord(flag[0]) * 9781 + ord(flag[1]) * 9174 + ord(flag[2]) * 3771 + ord(flag[3]) * 6972 + ord(flag[4]) * 6425 + ord(flag[5]) * 7631 + ord(flag[6]) * 8864 + ord(flag[7]) * 9117 + ord(flag[8]) * 4328 + ord(flag[9]) * 3919 + ord(flag[10]) * 6517 + ord(flag[11]) * 7165 + ord(flag[12]) * 6895 + ord(flag[13]) * 3609 + ord(flag[14]) * 3878 + ord(flag[15]) * 1593 + ord(flag[16]) * 9098 + ord(flag[17]) * 6432 + ord(flag[18]) * 2584 + ord(flag[19]) * 8403 + ord(flag[20]) * 4029 + ord(flag[21]) * 30 == 13060508
and ord(flag[0]) * 2511 + ord(flag[1]) * 8583 + ord(flag[2]) * 2428 + ord(flag[3]) * 9439 + ord(flag[4]) * 3662 + ord(flag[5]) * 3278 + ord(flag[6]) * 8305 + ord(flag[7]) * 1100 + ord(flag[8]) * 7972 + ord(flag[9]) * 8510 + ord(flag[10]) * 8552 + ord(flag[11]) * 9993 + ord(flag[12]) * 6855 + ord(flag[13]) * 1702 + ord(flag[14]) * 1640 + ord(flag[15]) * 3787 + ord(flag[16]) * 8161 + ord(flag[17]) * 2110 + ord(flag[18]) * 5320 + ord(flag[19]) * 3313 + ord(flag[20]) * 9286 + ord(flag[21]) * 74 == 10568195
and ord(flag[0]) * 4974 + ord(flag[1]) * 4445 + ord(flag[2]) * 7368 + ord(flag[3]) * 9132 + ord(flag[4]) * 5894 + ord(flag[5]) * 7822 + ord(flag[6]) * 7923 + ord(flag[7]) * 6822 + ord(flag[8]) * 2698 + ord(flag[9]) * 3643 + ord(flag[10]) * 8392 + ord(flag[11]) * 4126 + ord(flag[12]) * 1941 + ord(flag[13]) * 6641 + ord(flag[14]) * 2949 + ord(flag[15]) * 7405 + ord(flag[16]) * 9980 + ord(flag[17]) * 6349 + ord(flag[18]) * 3328 + ord(flag[19]) * 8766 + ord(flag[20]) * 9508 + ord(flag[21]) * 65 == 12514783
and ord(flag[0]) * 4127 + ord(flag[1]) * 4703 + ord(flag[2]) * 6409 + ord(flag[3]) * 4907 +ord(flag[4]) * 5230 + ord(flag[5]) * 3371 + ord(flag[6]) * 5666 + ord(flag[7]) * 3194 + ord(flag[8]) * 5448 + ord(flag[9]) * 8415 + ord(flag[10]) * 4525 + ord(flag[11]) * 4152 + ord(flag[12]) * 1467 + ord(flag[13]) * 5254 + ord(flag[14]) * 2256 + ord(flag[15]) * 1643 + ord(flag[16]) * 9113 + ord(flag[17]) * 8805 + ord(flag[18]) * 4315 + ord(flag[19]) * 8371 + ord(flag[20]) * 1919 + ord(flag[21]) * 2 == 10299950
and ord(flag[0]) * 6245 + ord(flag[1]) * 8783 + ord(flag[2]) * 6059 + ord(flag[3]) * 9375 + ord(flag[4]) * 9253 + ord(flag[5]) * 1974 + ord(flag[6]) * 8867 + ord(flag[7]) * 6423 + ord(flag[8]) * 2577 + ord(flag[9]) * 6613 + ord(flag[10]) * 2040 + ord(flag[11]) * 2209 + ord(flag[12]) * 4147 + ord(flag[13]) * 7151 + ord(flag[14]) * 1011 + ord(flag[15]) * 9446 +ord(flag[16]) * 4362 + ord(flag[17]) * 3073 + ord(flag[18]) * 3006 + ord(flag[19]) * 5499 + ord(flag[20]) * 8850 + ord(flag[21]) * 23 == 11180727
and ord(flag[0]) * 1907 + ord(flag[1]) * 9038 + ord(flag[2]) * 3932 + ord(flag[3]) * 7054 + ord(flag[4]) * 1135 + ord(flag[5]) * 5095 + ord(flag[6]) * 6962 + ord(flag[7]) * 6481 +ord(flag[8]) * 7049 + ord(flag[9]) * 5995 + ord(flag[10]) * 6233 + ord(flag[11]) * 1321 + ord(flag[12]) * 4455 + ord(flag[13]) * 8181 + ord(flag[14]) * 5757 + ord(flag[15]) * 6953 + ord(flag[16]) * 3167 + ord(flag[17]) * 5508 + ord(flag[18]) * 4602 + ord(flag[19]) * 1420 + ord(flag[20]) * 3075 + ord(flag[21]) * 25 == 10167536
and ord(flag[0]) * 1489 + ord(flag[1]) * 9236 + ord(flag[2]) * 7398 + ord(flag[3]) * 4088 + ord(flag[4]) * 4131 + ord(flag[5]) * 1657 + ord(flag[6]) * 9068 + ord(flag[7]) * 6420 + ord(flag[8]) * 3970 + ord(flag[9]) * 3265 + ord(flag[10]) * 5343 + ord(flag[11]) * 5386 + ord(flag[12]) * 2583 + ord(flag[13]) * 2813 + ord(flag[14]) * 7181 + ord(flag[15]) * 9116 + ord(flag[16]) * 4836 + ord(flag[17]) * 6917 + ord(flag[18]) * 1123 + ord(flag[19]) * 7276 + ord(flag[20]) * 2257 + ord(flag[21]) * 65 == 10202212
and ord(flag[0]) * 2097 + ord(flag[1]) * 1253 + ord(flag[2]) * 1469 + ord(flag[3]) * 2731 + ord(flag[4]) * 9565 + ord(flag[5]) * 9185 + ord(flag[6]) * 1095 + ord(flag[7]) * 8666 + ord(flag[8]) * 2919 + ord(flag[9]) * 7962 + ord(flag[10]) * 1497 + ord(flag[11]) * 6642 +ord(flag[12]) * 4108 + ord(flag[13]) * 6892 + ord(flag[14]) * 7161 + ord(flag[15]) * 7552 +ord(flag[16]) * 5666 + ord(flag[17]) * 4060 + ord(flag[18]) * 7799 + ord(flag[19]) * 5080 + ord(flag[20]) * 8516 + ord(flag[21]) * 43 == 10435786
and ord(flag[0]) * 1461 + ord(flag[1]) * 1676 + ord(flag[2]) * 4755 + ord(flag[3]) * 7982 + ord(flag[4]) * 3860 + ord(flag[5]) * 1067 + ord(flag[6]) * 6715 + ord(flag[7]) * 4019 + ord(flag[8]) * 4983 + ord(flag[9]) * 2031 + ord(flag[10]) * 1173 + ord(flag[11]) * 2241 +ord(flag[12]) * 2594 + ord(flag[13]) * 8672 + ord(flag[14]) * 4810 + ord(flag[15]) * 7963 + ord(flag[16]) * 7749 + ord(flag[17]) * 5730 + ord(flag[18]) * 9855 + ord(flag[19]) * 5858 +ord(flag[20]) * 2349 + ord(flag[21]) * 71 == 9526385
and ord(flag[0]) * 9025 + ord(flag[1]) * 9536 + ord(flag[2]) * 1515 + ord(flag[3]) * 8177 + ord(flag[4]) * 6109 + ord(flag[5]) * 4856 + ord(flag[6]) * 6692 + ord(flag[7]) * 4929 + ord(flag[8]) * 1010 + ord(flag[9]) * 3995 + ord(flag[10]) * 3511 + ord(flag[11]) * 5910 + ord(flag[12]) * 3501 + ord(flag[13]) * 3731 + ord(flag[14]) * 6601 + ord(flag[15]) * 6200 + ord(flag[16]) * 8177 + ord(flag[17]) * 5488 + ord(flag[18]) * 5957 + ord(flag[19]) * 9661 + ord(flag[20]) * 4956 + ord(flag[21]) * 48 == 11822714
and ord(flag[0]) * 4462 + ord(flag[1]) * 1940 + ord(flag[2]) * 5956 + ord(flag[3]) * 4965 + ord(flag[4]) * 9268 + ord(flag[5]) * 9627 + ord(flag[6]) * 3564 + ord(flag[7]) * 5417 + ord(flag[8]) * 2039 + ord(flag[9]) * 7269 + ord(flag[10]) * 9667 + ord(flag[11]) * 4158 + ord(flag[12]) * 2856 + ord(flag[13]) * 2851 + ord(flag[14]) * 9696 + ord(flag[15]) * 5986 + ord(flag[16]) * 6237 + ord(flag[17]) * 5845 + ord(flag[18]) * 5467 + ord(flag[19]) * 5227 + ord(flag[20]) * 4771 + ord(flag[21]) * 72 == 11486796
and ord(flag[0]) * 4618 + ord(flag[1]) * 8621 + ord(flag[2]) * 8144 + ord(flag[3]) * 7115 + ord(flag[4]) * 1577 + ord(flag[5]) * 8602 + ord(flag[6]) * 3886 + ord(flag[7]) * 3712 + ord(flag[8]) * 1258 + ord(flag[9]) * 7063 + ord(flag[10]) * 1872 + ord(flag[11]) * 9855 + ord(flag[12]) * 4167 + ord(flag[13]) * 7615 + ord(flag[14]) * 6298 + ord(flag[15]) * 7682 + ord(flag[16]) * 8795 + ord(flag[17]) * 3856 + ord(flag[18]) * 6217 + ord(flag[19]) * 5764 + ord(flag[20]) * 5076 + ord(flag[21]) * 93 == 11540145
and ord(flag[0]) * 7466 + ord(flag[1]) * 8442 + ord(flag[2]) * 4822 + ord(flag[3]) * 7639 + ord(flag[4]) * 2049 + ord(flag[5]) * 7311 + ord(flag[6]) * 5816 + ord(flag[7]) * 8433 + ord(flag[8]) * 5905 + ord(flag[9]) * 4838 + ord(flag[10]) * 1251 + ord(flag[11]) * 8184 + ord(flag[12]) * 6465 + ord(flag[13]) * 4634 + ord(flag[14]) * 5513 + ord(flag[15]) * 3160 + ord(flag[16]) * 6720 + ord(flag[17]) * 9205 + ord(flag[18]) * 6671 + ord(flag[19]) * 7716 + ord(flag[20]) * 1905 + ord(flag[21]) * 29 == 12227250
and ord(flag[0]) * 5926 + ord(flag[1]) * 9095 + ord(flag[2]) * 2048 + ord(flag[3]) * 4639 + ord(flag[4]) * 3035 + ord(flag[5]) * 9560 + ord(flag[6]) * 1591 + ord(flag[7]) * 2392 + ord(flag[8]) * 1812 + ord(flag[9]) * 6732 + ord(flag[10]) * 9454 + ord(flag[11]) * 8175 + ord(flag[12]) * 7346 + ord(flag[13]) * 6333 + ord(flag[14]) * 9812 + ord(flag[15]) * 2034 + ord(flag[16]) * 6634 + ord(flag[17]) * 1762 + ord(flag[18]) * 7058 + ord(flag[19]) * 3524 + ord(flag[20]) * 7462 + ord(flag[21]) * 11 == 11118093:
print('Congratulate!!!You are right!')
else:
print('What a pity...Please try again >__<')

通过代码可以看出是一个21元的方程组,题目也提示可以使用z3写脚本来得到flag

VScode多光标操作
alt+shift拖动可以在同一列添加多个光标
选中部分字符 ctrl+f2可以选中所有的相同字符
ctrl+` 弹出终端面板

z3的使用说明
原文:https://ericpony.github.io/z3py-tutorial/guide-examples.htm
用途:软件/硬件的验证和测试,约束求解,混合系统分析,(安全性,生物,计算机分析,几何问题)
Linux安装z3https://github.com/angr/angr-z3
根据angr的源文件https://github.com/bannsec/angr-Windows 加了两个东西,详情去找新知\angr的安装

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
from z3 import *  ##导包
flag = [Int("input[%d]"%i) for i in range(22)] ##设置的22个元
s = Solver() ##定义的求解器
s.add(flag[0] * 7072 + flag[1] * 2523 + flag[2] * 6714 + flag[3] * 8810 +flag[4] * 6796 + flag[5] * 2647 + flag[6] * 1347 + flag[7] * 1289 + flag[8] *8917 + flag[9] * 2304 + flag[10] * 5001 + flag[11] * 2882 + flag[12] * 7232 +flag[13] * 3192 + flag[14] * 9676 + flag[15] * 5436 + flag[16] * 4407 + flag[17]* 6269 + flag[18] * 9623 + flag[19] * 6230 + flag[20] * 6292 + flag[21] * 57 ==10743134)
s.add(flag[0] * 3492 + flag[1] * 1613 + flag[2] * 3234 + flag[3] * 5656 +flag[4] * 9182 + flag[5] * 4240 + flag[6] * 8808 + flag[7] * 9484 + flag[8] *4000 + flag[9] * 1475 + flag[10] * 2616 + flag[11] * 2766 + flag[12] * 6822 +flag[13] * 1068 + flag[14] * 9768 + flag[15] * 1420 + flag[16] * 4528 + flag[17]* 1031 + flag[18] * 8388 + flag[19] * 2029 + flag[20] * 2463 + flag[21] * 32 ==9663091)
s.add(flag[0] * 9661 + flag[1] * 1108 + flag[2] * 2229 + flag[3] * 1256 +flag[4] * 7747 + flag[5] * 5775 + flag[6] * 5211 + flag[7] * 2387 + flag[8] *1997 + flag[9] * 4045 + flag[10] * 7102 + flag[11] * 7853 + flag[12] * 5596 +flag[13] * 6952 + flag[14] * 8883 + flag[15] * 5125 + flag[16] * 9572 + flag[17]* 1149 + flag[18] * 7583 + flag[19] * 1075 + flag[20] * 9804 + flag[21] * 72 ==10521461)
s.add(flag[0] * 4314 + flag[1] * 3509 + flag[2] * 6200 + flag[3] * 5546 +flag[4] * 1705 + flag[5] * 9518 + flag[6] * 2975 + flag[7] * 2689 + flag[8] *2412 + flag[9] * 8659 + flag[10] * 5459 + flag[11] * 7572 + flag[12] * 3042 +flag[13] * 9701 + flag[14] * 4697 + flag[15] * 9863 + flag[16] * 1296 + flag[17]* 1278 + flag[18] * 5721 + flag[19] * 5116 + flag[20] * 4147 + flag[21] * 52 ==9714028)
s.add(flag[0] * 2310 + flag[1] * 1379 + flag[2] * 5900 + flag[3] * 4876 +flag[4] * 5329 + flag[5] * 6485 + flag[6] * 6610 + flag[7] * 7179 + flag[8] *7897 + flag[9] * 1094 + flag[10] * 4825 + flag[11] * 8101 + flag[12] * 9519 +flag[13] * 3048 + flag[14] * 3168 + flag[15] * 2775 + flag[16] * 4366 + flag[17]* 4066 + flag[18] * 7490 + flag[19] * 5533 + flag[20] * 2139 + flag[21] * 87 ==10030960)
s.add(flag[0] * 1549 + flag[1] * 8554 + flag[2] * 6510 + flag[3] * 6559 +flag[4] * 5570 + flag[5] * 1003 + flag[6] * 8562 + flag[7] * 6793 + flag[8] *3509 + flag[9] * 4965 + flag[10] * 6111 + flag[11] * 1229 + flag[12] * 5654 +flag[13] * 2204 + flag[14] * 2217 + flag[15] * 5039 + flag[16] * 5657 + flag[17]* 9426 + flag[18] * 7604 + flag[19] * 5883 + flag[20] * 5285 + flag[21] * 17 ==10946682)
s.add(flag[0] * 2678 + flag[1] * 4369 + flag[2] * 7509 + flag[3] * 1564 +flag[4] * 7777 + flag[5] * 2271 + flag[6] * 9696 + flag[7] * 3874 + flag[8] *2212 + flag[9] * 6764 + flag[10] * 5727 + flag[11] * 5971 + flag[12] * 5876 +flag[13] * 9959 + flag[14] * 4604 + flag[15] * 8461 + flag[16] * 2350 + flag[17]* 3564 + flag[18] * 1831 + flag[19] * 6088 + flag[20] * 4575 + flag[21] * 9 ==10286414)
s.add(flag[0] * 8916 + flag[1] * 8647 + flag[2] * 4522 + flag[3] * 3579 +flag[4] * 5319 + flag[5] * 9124 + flag[6] * 9535 + flag[7] * 5125 + flag[8] *3235 + flag[9] * 3246 + flag[10] * 3378 + flag[11] * 9221 + flag[12] * 1875 +flag[13] * 1008 + flag[14] * 6262 + flag[15] * 1524 + flag[16] * 8851 + flag[17]* 4367 + flag[18] * 7628 + flag[19] * 9404 + flag[20] * 2065 + flag[21] * 9 ==11809388)
s.add(flag[0] * 9781 + flag[1] * 9174 + flag[2] * 3771 + flag[3] * 6972 +flag[4] * 6425 + flag[5] * 7631 + flag[6] * 8864 + flag[7] * 9117 + flag[8] *4328 + flag[9] * 3919 + flag[10] * 6517 + flag[11] * 7165 + flag[12] * 6895 +flag[13] * 3609 + flag[14] * 3878 + flag[15] * 1593 + flag[16] * 9098 + flag[17]* 6432 + flag[18] * 2584 + flag[19] * 8403 + flag[20] * 4029 + flag[21] * 30 ==13060508)
s.add(flag[0] * 2511 + flag[1] * 8583 + flag[2] * 2428 + flag[3] * 9439 +flag[4] * 3662 + flag[5] * 3278 + flag[6] * 8305 + flag[7] * 1100 + flag[8] *7972 + flag[9] * 8510 + flag[10] * 8552 + flag[11] * 9993 + flag[12] * 6855 +flag[13] * 1702 + flag[14] * 1640 + flag[15] * 3787 + flag[16] * 8161 + flag[17]* 2110 + flag[18] * 5320 + flag[19] * 3313 + flag[20] * 9286 + flag[21] * 74 ==10568195)
s.add(flag[0] * 4974 + flag[1] * 4445 + flag[2] * 7368 + flag[3] * 9132 +flag[4] * 5894 + flag[5] * 7822 + flag[6] * 7923 + flag[7] * 6822 + flag[8] *2698 + flag[9] * 3643 + flag[10] * 8392 + flag[11] * 4126 + flag[12] * 1941 +flag[13] * 6641 + flag[14] * 2949 + flag[15] * 7405 + flag[16] * 9980 + flag[17]* 6349 + flag[18] * 3328 + flag[19] * 8766 + flag[20] * 9508 + flag[21] * 65 ==12514783)
s.add(flag[0] * 4127 + flag[1] * 4703 + flag[2] * 6409 + flag[3] * 4907 +flag[4] * 5230 + flag[5] * 3371 + flag[6] * 5666 + flag[7] * 3194 + flag[8] *5448 + flag[9] * 8415 + flag[10] * 4525 + flag[11] * 4152 + flag[12] * 1467 +flag[13] * 5254 + flag[14] * 2256 + flag[15] * 1643 + flag[16] * 9113 + flag[17]* 8805 + flag[18] * 4315 + flag[19] * 8371 + flag[20] * 1919 + flag[21] * 2 ==10299950)
s.add(flag[0] * 6245 + flag[1] * 8783 + flag[2] * 6059 + flag[3] * 9375 +flag[4] * 9253 + flag[5] * 1974 + flag[6] * 8867 + flag[7] * 6423 + flag[8] *2577 + flag[9] * 6613 + flag[10] * 2040 + flag[11] * 2209 + flag[12] * 4147 +flag[13] * 7151 + flag[14] * 1011 + flag[15] * 9446 + flag[16] * 4362 + flag[17]* 3073 + flag[18] * 3006 + flag[19] * 5499 + flag[20] * 8850 + flag[21] * 23 ==11180727)
s.add(flag[0] * 1907 + flag[1] * 9038 + flag[2] * 3932 + flag[3] * 7054 +flag[4] * 1135 + flag[5] * 5095 + flag[6] * 6962 + flag[7] * 6481 + flag[8] *7049 + flag[9] * 5995 + flag[10] * 6233 + flag[11] * 1321 + flag[12] * 4455 +flag[13] * 8181 + flag[14] * 5757 + flag[15] * 6953 + flag[16] * 3167 + flag[17]* 5508 + flag[18] * 4602 + flag[19] * 1420 + flag[20] * 3075 + flag[21] * 25 ==10167536)
s.add(flag[0] * 1489 + flag[1] * 9236 + flag[2] * 7398 + flag[3] * 4088 +flag[4] * 4131 + flag[5] * 1657 + flag[6] * 9068 + flag[7] * 6420 + flag[8] *3970 + flag[9] * 3265 + flag[10] * 5343 + flag[11] * 5386 + flag[12] * 2583 +flag[13] * 2813 + flag[14] * 7181 + flag[15] * 9116 + flag[16] * 4836 + flag[17]* 6917 + flag[18] * 1123 + flag[19] * 7276 + flag[20] * 2257 + flag[21] * 65 ==10202212)
s.add(flag[0] * 2097 + flag[1] * 1253 + flag[2] * 1469 + flag[3] * 2731 +flag[4] * 9565 + flag[5] * 9185 + flag[6] * 1095 + flag[7] * 8666 + flag[8] *2919 + flag[9] * 7962 + flag[10] * 1497 + flag[11] * 6642 + flag[12] * 4108 +flag[13] * 6892 + flag[14] * 7161 + flag[15] * 7552 + flag[16] * 5666 + flag[17]* 4060 + flag[18] * 7799 + flag[19] * 5080 + flag[20] * 8516 + flag[21] * 43 ==10435786)
s.add(flag[0] * 1461 + flag[1] * 1676 + flag[2] * 4755 + flag[3] * 7982 +flag[4] * 3860 + flag[5] * 1067 + flag[6] * 6715 + flag[7] * 4019 + flag[8] *4983 + flag[9] * 2031 + flag[10] * 1173 + flag[11] * 2241 + flag[12] * 2594 +flag[13] * 8672 + flag[14] * 4810 + flag[15] * 7963 + flag[16] * 7749 + flag[17]* 5730 + flag[18] * 9855 + flag[19] * 5858 + flag[20] * 2349 + flag[21] * 71 ==9526385)
s.add(flag[0] * 9025 + flag[1] * 9536 + flag[2] * 1515 + flag[3] * 8177 +flag[4] * 6109 + flag[5] * 4856 + flag[6] * 6692 + flag[7] * 4929 + flag[8] *1010 + flag[9] * 3995 + flag[10] * 3511 + flag[11] * 5910 + flag[12] * 3501 +flag[13] * 3731 + flag[14] * 6601 + flag[15] * 6200 + flag[16] * 8177 + flag[17]* 5488 + flag[18] * 5957 + flag[19] * 9661 + flag[20] * 4956 + flag[21] * 48 ==11822714)
s.add(flag[0] * 4462 + flag[1] * 1940 + flag[2] * 5956 + flag[3] * 4965 +flag[4] * 9268 + flag[5] * 9627 + flag[6] * 3564 + flag[7] * 5417 + flag[8] *2039 + flag[9] * 7269 + flag[10] * 9667 + flag[11] * 4158 + flag[12] * 2856 +flag[13] * 2851 + flag[14] * 9696 + flag[15] * 5986 + flag[16] * 6237 + flag[17]* 5845 + flag[18] * 5467 + flag[19] * 5227 + flag[20] * 4771 + flag[21] * 72 ==11486796)
s.add(flag[0] * 4618 + flag[1] * 8621 + flag[2] * 8144 + flag[3] * 7115 +flag[4] * 1577 + flag[5] * 8602 + flag[6] * 3886 + flag[7] * 3712 + flag[8] *1258 + flag[9] * 7063 + flag[10] * 1872 + flag[11] * 9855 + flag[12] * 4167 +flag[13] * 7615 + flag[14] * 6298 + flag[15] * 7682 + flag[16] * 8795 + flag[17]* 3856 + flag[18] * 6217 + flag[19] * 5764 + flag[20] * 5076 + flag[21] * 93 ==11540145)
s.add(flag[0] * 7466 + flag[1] * 8442 + flag[2] * 4822 + flag[3] * 7639 +flag[4] * 2049 + flag[5] * 7311 + flag[6] * 5816 + flag[7] * 8433 + flag[8] *5905 + flag[9] * 4838 + flag[10] * 1251 + flag[11] * 8184 + flag[12] * 6465 +flag[13] * 4634 + flag[14] * 5513 + flag[15] * 3160 + flag[16] * 6720 + flag[17]* 9205 + flag[18] * 6671 + flag[19] * 7716 + flag[20] * 1905 + flag[21] * 29 ==12227250)
s.add(flag[0] * 5926 + flag[1] * 9095 + flag[2] * 2048 + flag[3] * 4639 +flag[4] * 3035 + flag[5] * 9560 + flag[6] * 1591 + flag[7] * 2392 + flag[8] *1812 + flag[9] * 6732 + flag[10] * 9454 + flag[11] * 8175 + flag[12] * 7346 +flag[13] * 6333 + flag[14] * 9812 + flag[15] * 2034 + flag[16] * 6634 + flag[17]* 1762 + flag[18] * 7058 + flag[19] * 3524 + flag[20] * 7462 + flag[21] * 11 ==11118093)
if s.check() == sat: ##检查是否有解(有解输出的是,判断结果是否==sat
m = s.model() ##计算得到最后的结果
for i in range(22): ##得到结果的一串遍历
print(chr(int(str(m[flag[i]]))),end = '') ##输出结果

D_flag

首先要搞清楚的逆向中dll和exe文件的区别是什么,dll,全称是Dynamic Link Libaray,即动态链接库,将程序运行所需要的类或方法的实现放在dll中,这样当可执行文件(即.exe文件)需要使用相关的类、方法时从dll中动态地获取,节省了可执行文件在编译、执行时花费的时间。dll比静态库更方便的是不用重新编译全部的.exe文件,需修改相应的dll的源程序就可以实现功能上的修改。
在C#中,如果新建的工程类型是“Windows窗体应用程序”或“控制台应用程序”那么编译生成的就是.exe文件,如果新建的工程类型是“类库”,那么编译生成的是dll文件,一般在设计中,采用两种方法相结合的方式,即在一个Solution中既有.exe项目也有.dll项目,将所有的类、接口的实现都放在类库中,.exe的源代码里只放Main函数和功能入口。
image.png

C#逆向可以使用dnspy进行反编译

C#逆向常见的三种情况

  • .net app 逆向,原理分析或修改,功能增加(目标exe,dll)
  • com组件dll,原理分析或修改,功能增加(目标dll)
  • .net visual basic 脚本分析(病毒行为检测)

image.png

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
// D_flate
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
private static void Main()
{
int f = 0; //定义一个变量f默认值为0
int[] flag = new int[]
{
109,111,101,99,116,102,123,68,95,102,108,97,116,101,95,105,
115,95,67,95,115,104,97,114,112,33,125
}; //定义一个叫flag的数组,存放数字
Console.WriteLine("In music theory, there is a note that has the same pitch as D flat.");
Console.WriteLine("Do you know it?\nNow plz input your flag:");
//输出两行提示文字
string input = Console.ReadLine();
//输入字符 input
byte[] byteArray = Encoding.ASCII.GetBytes(input);
//输入的数组 进行ascii编码
for (int i = 0; i < input.Length; i++)
{
if (flag[i] == (int)byteArray[i])
//将输入的byteArray字符强制转化,为int类型,如果等于的flag的数字的话,
//f++继续比较,否则退出
{
f++;
}
}
if (f == flag.Length)
{
Console.WriteLine("TTTTTQQQQQQLLLLLLL!!! This is your flag!");
return;
}
Console.WriteLine("QwQ, plz try again.");
}

/*Console.ReadKey(); 是针对 VS.NET 用户的。
这使得程序会等待一个按键的动作,防止程序从 Visual Studio
.NET 启动时屏幕会快速运行并关闭。*/

1
2
3
4
5
6
7
8
9
key = [109,111,101,99,116,102,123,68,95,102,108,97,116,101,95,105,
115,95,67,95,115,104,97,114,112,33,125]

flag = ''
for i in range(len(key)):
flag += chr(key[i])
print(flag)

##moectf{D_flate_is_C_sharp!}

(小声逼逼:官方的exp参考没自己写的香~

chicken_soup

查壳是32位的程序,拖进IDA分析,F5发现伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[100]; // [esp+10h] [ebp-68h] BYREF
//定义变量数组v4,长度为100
puts("I poisoned the program... Can you reverse it?!");
puts("Come on! Give me your flag:");
//输出提示
sub_4012A0("%s", (char)v4); //这里的v4非常蹊跷,发现里面啥也没有 如下图示
if ( strlen(v4) == 38 ) //要求的v4长度得是38
{
((void (__cdecl *)(char *))loc_401000)(v4);
((void (__cdecl *)(char *))loc_401080)(v4); //这两个函数也比较奇怪,里面感觉没东西
if ( sub_401110(v4, &unk_403000) ) //这里表示成功 猜测程序中是有指令模糊的
puts("\nTTTTTTTTTTQQQQQQQQQQQQQLLLLLLLLL!!!!");
else
puts("\nQwQ, please try again.");
return 0;
}
else
{
puts("\nQwQ, please try again.");
return 0;
}
}

v4 展开图loc_401000展开图
loc_401080展开图
根据题目的提示也是花指令的原因
根据伪代码:先是将v4的值传入字符,再用loc_401000和loc_401080进行字符的加密,最后和unk_403000进行对比
双击之后,展开发现都是飘红的,一串杂乱的数据无法识别–>因为ida的分析被花指令扰乱了。在飘红的loc_40100D地方按U键,将代码转为未定义的数据,在unk_40100E处按C转为代码。
按U转字符前
按U转字符后
unk_40100E处按C转代码后
然后在unk_40100E处按C转代码,40100D处是无用指令,扰乱了ida的分析,patch掉没有用的指令
image.png

patch的方法:

  1. 找到飘红处:U–>代码转为未定义数据
  2. unk_……函数 C转为代码
  3. 选中 jz jnz db三行指令–>nop 快捷键:ctrl+alt+k
  4. db指令 C–>转为代码
  5. push处 P–>创建函数
  6. F5查看伪代码

选中这3句话,按下ctrl+alt+k,输入nop点patch,40100D处的0x90也按C转为代码,然后在 loc_401000处按P创建函数,F5就可以得到伪代码。可以看出loc_401000是一个加的操作a1[i] += a1[i + 1]
image.png
同样的patch方法将loc_401080函数也整出来。可以看出是一个移位的函数a1[i] = (16 * a1[i]) | ((int)(unsigned __int8)a1[i] >> 4) 将每一个字节的前4bit放到后 4bit,后4bit放到前4bit。
image.png
最后与unk_403000函数的数据进行比较,将数据导出
image.png

报错:ValueError: bytes must be in range(0, 256)
image.png
bytes()函数:
语法:class bytes([source[, encoding[, errors]]])
返回一个新的“bytes”对象,它是0<=x<256范围内的不可变整数序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enc=[0xCD, 0x4D, 0x8C, 0x7D, 0xAD, 0x1E, 0xBE, 0x4A, 0x8A, 0x7D, 
0xBC, 0x7C, 0xFC, 0x2E, 0x2A, 0x79, 0x9D, 0x6A, 0x1A, 0xCC,
0x3D, 0x4A, 0xF8, 0x3C, 0x79, 0x69, 0x39, 0xD9, 0xDD, 0x9D,
0xA9, 0x69, 0x4C, 0x8C, 0xDD, 0x59, 0xE9, 0xD7]
for i in range(len(enc)):
#伪代码中loc_401080是第二步加密
#所以在exp中是第一层解密
enc[i] = ((enc[i]>>4)|(enc[i]<<4)) &0xff
#for i in range(len(enc)):
for i in range(len(enc)-1,0,-1):
#range([start],stop,[step]) 减的操作 所以step=-1
#源代码:enc[i] = enc[i+1]
enc[i-1]-=enc[i]
print(bytes(enc))

##moectf{p4tch_pr0gr4m_t0_d3c0mpi1e_it!}

花指令介绍:什么是花指令
&0xff的作用:主要是为了将有符号数转换为无符号数,实际意义就是取字节,高位补0,保留低八位的数

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
#include <stdio.h>
#include <string.h>
unsigned char check[]={0xCD, 0x4D, 0x8C, 0x7D, 0xAD, 0x1E, 0xBE, 0x4A, 0x8A, 0x7D,
0xBC, 0x7C, 0xFC, 0x2E, 0x2A, 0x79, 0x9D, 0x6A, 0x1A, 0xCC,
0x3D, 0x4A, 0xF8, 0x3C, 0x79, 0x69, 0x39, 0xD9, 0xDD, 0x9D,
0xA9, 0x69, 0x4C, 0x8C, 0xDD, 0x59, 0xE9, 0xD7,0};
void enc1(unsigned char*input){
_asm {
jz label
jnz label
_emit 0xe9
label:
}
for(int i =0; i<strlen((const char*)input)-1;i++)
input[i]+=input[i+1];
}
void enc2(unsigned char*input){
_asm{
jz label
jnz label
_emit 0xe9
label:
}
for(int i =0;i<strlen((const char*)input);i++)
input[i]=((input[i]>>4)|(input[i]<<4))&0xff;
}
int my_strcmp(unsigned char*s1,unsigned char*s2){
int i = 0,f=0;
while(i<38)
if(s1[i]==s2[i])
f++;
if(f==38)
return 1;
else
return 0;
}
int main(){
unsigned char input[100];
puts("I poisoned the program... Can you reverse it?!");
puts("Come on! Give me your flag:");
scanf_s("%s",input,100);
if ( strlen((const char*)input) != 38 )
{
puts("\nQwQ, please try again.");
return 0;
}
enc1(input);
enc2(input);
if(my_strcmp(input,check))
puts("\nTTTTTTTTTTQQQQQQQQQQQQQLLLLLLLLL!!!!");
else
puts("\nQwQ, please try again.");
return 0;
}

fake key

根据伪代码:

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
int __cdecl main(int argc, const char **argv, const char **envp)
{
char Str[112]; // [rsp+20h] [rbp-80h] BYREF
int v5; // [rsp+90h] [rbp-10h]
int v6; // [rsp+94h] [rbp-Ch]
int j; // [rsp+98h] [rbp-8h]
int i; // [rsp+9Ch] [rbp-4h]

sub_401800(argc, argv, envp);
v6 = strlen(::Str); //Str = 'yunzh1jun' v6是Str的长度 但这个密钥是假的quq~
puts("I changed the key secretly, you can't find the right key!");
puts("And I use random numbers to rot my input, you can never guess them!");
puts("Unless you debug to get the key and random numbers...");
puts("Now give me your flag:");
scanf("%s", Str); //输入Str
v5 = strlen(Str); //获取Str的长度
for ( i = 0; i < v5; ++i )
Str[i] ^= ::Str[i % v6]; //Str的每一个元素与::Str中每个元素对v6取余重新赋给::Str
for ( j = 0; j < v5; ++j )
Str[j] += rand() % 10; //Str的每个元素,rand()%10 取出所得的随机数的个位。
if ( (unsigned int)sub_4015A2(Str, &unk_403020) ) //两个数组相同则成功
puts("\nRight! TTTTTQQQQQLLLLL!!!");
else
puts("QwQ, plz try again.");
return 0;
}

可以看出伪代码还是比较乱的,将Str-->input``::Str-->key``v6-->key_len``v5-->input_len分别对应改为我们能看清楚的函数名
Str展开
unk_403020展开的数组
官方给的wp中写道是:双击已经改过(::Str)的key字符是yunzh1jun,在line17行下断点进行调式

啊~G掉了,ida动调不了,需要自己修一下,报错如下
image.png
官网下载bochs:http://sourceforge.net/projects/bochs/files/bochs/
默认下载的地址就好 C:\Program Files\Bochs-2.7 额额额 没好 呜呜呜~~
害,我发现这个家伙,服了。
是用这个家伙来构建一个虚拟机一样的家伙来动调代码,完全可以用本地windows来动调的!
cfea52d0fae8e1797ff0ffefb3c74971.png
这里选择的是Remote Windows debugger而不是Local Windows debugger

image.png
出现动调之后界面之后,双击key发现,这里的key值变掉了。
(数据全部选中之后按C转为代码) key值即为yunzh1junTCL,trackYYDSimage.png
关键的一步将真正的key值找出来了。

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
int __cdecl main(int argc, const char **argv, const char **envp)
{
char input[112]; // [rsp+20h] [rbp-80h] BYREF
int input_len; // [rsp+90h] [rbp-10h]
int key_len; // [rsp+94h] [rbp-Ch]
int j; // [rsp+98h] [rbp-8h]
int i; // [rsp+9Ch] [rbp-4h]

sub_401800(argc, argv, envp);
key_len = strlen(key);
puts("I changed the key secretly, you can't find the right key!");
puts("And I use random numbers to rot my input, you can never guess them!");
puts("Unless you debug to get the key and random numbers...");
puts("Now give me your flag:");
scanf("%s", input);
input_len = strlen(input);
for ( i = 0; i < input_len; ++i )
input[i] ^= key[i % key_len];
for ( j = 0; j < input_len; ++j )
input[j] += rand() % 10;
if ( (unsigned int)sub_4015A2(input, enc) )
puts("\nRight! TTTTTQQQQQLLLLL!!!");
else
puts("QwQ, plz try again.");
return 0;
}
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned char enc = {21, 33, 15, 25, 37, 91, 25, 57, 95, 58,
59, 48, 116, 7, 67, 63, 9, 90, 52, 12,
116, 63, 30, 45, 39, 33, 18, 22, 31, 0};
unsigned char key = {"yunzh1jun"};

__attribute((constructor)) static void fun(){
strcat(key,"TCL,trackYYDS");
}
int main(){
int key_len = strlen(key);
unsigned char input[100];

puts("I changed the key secretly, you can't find the right key!");
puts("And I use random numbers to rot my input, you can never guess them!");
puts("Unless you debug to get the key and random numbers...");

puts("Now give me your flag:");
scanf("%s", input);
int input_len = strlen(input);

for ( i = 0; i < input_len; ++i )
input[i] ^= key[i % key_len];

for ( j = 0; j < input_len; ++j )
input[j] += rand() % 10;

if ( !strcmp(input,enc))
puts("\nRight! TTTTTQQQQQLLLLL!!!");
else
puts("QwQ, plz try again.");
return 0;
}

害 不会了 待会儿再继续复盘
新思路:
https://iooo.top/share/moectf2022.html#fakekey


Art

通过直接将程序打开发现会和upx壳打包有关 使用工具脱壳
查看伪代码(整理后的代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[112]; // [rsp+20h] [rbp-60h] BYREF
char input[108]; // [rsp+90h] [rbp+10h] BYREF
int i; // [rsp+FCh] [rbp+7Ch]

sub_402030(argc, argv, envp);
puts("Do you know UPX???");
puts("Oh no...Something seems to be wrong...My equations has multiple solutions...");
puts("May be I can check it by a hash algorithm. You can never reverse it!!!");
printf("Input your flag:");
scanf("%s", input);
for ( i = 0; i <= 27; ++i )
v4[i] = input[i];
for ( i = 1; i <= 27; ++i )
input[i - 1] ^= (input[i - 1] % 17 + input[i]) ^ 0x19;//加密语句
if ( !strcmp(input, &Str2) && (unsigned int)sub_401550(v4) )//搞懂这个sub_401550函数是啥东西
puts("\nGood job!!! You know UPX and hash!!!");
else
puts("\nQwQ. Something wrong. Please try again. >_<");
return 0;
}

读代码操作
大概都是可以看懂的

  1. sub_402030(argc, argv, envp); marks the beginning and end of program execution. A C or C++ program must have one function named main.
    三个参数:
    :::info
    argc:表示命令行参数,第一个是执行程序名,最少是1
    argv:具体的参数
    envp:系统环境的变量,“名称=值”的格式,NULL为结束
    :::
    将Str2的字符提取出来。
    另一个函数就是sub_401550函数对v4进行处理只有点击进去继续看

sub_401550函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
_BOOL8 __fastcall sub_401550(const char *a1)
{
unsigned __int64 a1_len; // rax
char v3[112]; // [rsp+20h] [rbp-A0h] BYREF
char Buf2[44]; // [rsp+90h] [rbp-30h] BYREF
int k; // [rsp+BCh] [rbp-4h]

k = 1;
sub_401B66((__int64)v3);
a1_len = strlen(a1);
sub_401BE0((__int64)v3, (__int64)a1, a1_len);
sub_401C7D((__int64)v3, (__int64)Buf2);
return memcmp(&unk_404040, Buf2, 32ui64) == 0;
}

image.png
其中存有好几个函数继续加密

sub_401B66函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
__int64 __fastcall sub_401B66(__int64 a1)
{
__int64 result; // rax

*(_DWORD *)(a1 + 64) = 0;
*(_QWORD *)(a1 + 72) = 0i64;
*(_DWORD *)(a1 + 80) = 0x6A09E667;
*(_DWORD *)(a1 + 84) = 0xBB67AE85;
*(_DWORD *)(a1 + 88) = 0x3C6EF372;
*(_DWORD *)(a1 + 92) = 0xA54FF53A;
*(_DWORD *)(a1 + 96) = 0x510E527F;
*(_DWORD *)(a1 + 100) = 0x9B05688C;
*(_DWORD *)(a1 + 104) = 0x1F83D9AB;
result = a1;
*(_DWORD *)(a1 + 108) = 0x5BE0CD19;
return result;
}

image.png
这里将数值都换成了16进制的情况

sub_401BE0函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__int64 __fastcall sub_401BE0(__int64 a1, __int64 a2, unsigned __int64 a3)
{
__int64 result; // rax
unsigned int i; // [rsp+2Ch] [rbp-4h]

for ( i = 0; ; ++i )
{
result = i;
if ( a3 <= i )
break;
*(_BYTE *)(a1 + (unsigned int)(*(_DWORD *)(a1 + 64))++) = *(_BYTE *)(a2 + i);
if ( *(_DWORD *)(a1 + 64) == 64 )
{
sub_401710(a1, a1);
*(_QWORD *)(a1 + 72) += 512i64;
*(_DWORD *)(a1 + 64) = 0;
}
}
return result;
}

image.png

sub_401710函数
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
_DWORD *__fastcall sub_401710(_DWORD *a1, __int64 a2)
{
_DWORD *result; // rax
int v3[64]; // [rsp+0h] [rbp-80h]
int v4; // [rsp+100h] [rbp+80h]
int v5; // [rsp+104h] [rbp+84h]
unsigned int v6; // [rsp+108h] [rbp+88h]
unsigned int i; // [rsp+10Ch] [rbp+8Ch]
int v8; // [rsp+110h] [rbp+90h]
int v9; // [rsp+114h] [rbp+94h]
int v10; // [rsp+118h] [rbp+98h]
int v11; // [rsp+11Ch] [rbp+9Ch]
int v12; // [rsp+120h] [rbp+A0h]
int v13; // [rsp+124h] [rbp+A4h]
int v14; // [rsp+128h] [rbp+A8h]
int v15; // [rsp+12Ch] [rbp+ACh]

i = 0;
v6 = 0;
while ( i <= 0xF )
{
v3[i++] = (*(unsigned __int8 *)(v6 + 2 + a2) << 8) | (*(unsigned __int8 *)(v6 + 1 + a2) << 16) | (*(unsigned __int8 *)(a2 + v6) << 24) | *(unsigned __int8 *)(v6 + 3 + a2);
v6 += 4;
}
while ( i <= 0x3F )
{
v3[i] = v3[i - 16]+ (__ROL4__(v3[i - 15], 14) ^ __ROR4__(v3[i - 15], 7) ^ ((unsigned int)v3[i - 15] >> 3))
+ v3[i - 7]+ (((unsigned int)v3[i - 2] >> 10) ^ __ROL4__(v3[i - 2], 13) ^ __ROL4__(v3[i - 2], 15));
++i;
}
v15 = a1[20];
v14 = a1[21];
v13 = a1[22];
v12 = a1[23];
v11 = a1[24];
v10 = a1[25];
v9 = a1[26];
v8 = a1[27];
for ( i = 0; i <= 0x3F; ++i )
{
v5 = (v10 & v11 ^ v9 & ~v11) //~取反
+ (__ROL4__(v11, 7) ^ __ROR4__(v11, 11) ^ __ROR4__(v11, 6))
+ v8
+ dword_405120[i]
+ v3[i];
v4 = (__ROL4__(v15, 10) ^ __ROR4__(v15, 13) ^ __ROR4__(v15, 2)) + (v15 & (v13 ^ v14) ^ v13 & v14);
v8 = v9;
v9 = v10;
v10 = v11;
v11 = v12 + v5;
v12 = v13;
v13 = v14;
v14 = v15;
v15 = v5 + v4;
}
a1[20] += v15;
a1[21] += v14;
a1[22] += v13;
a1[23] += v12;
a1[24] += v11;
a1[25] += v10;
a1[26] += v9;
result = a1;
a1[27] += v8;
return result;
}
sub_401C7D函数
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
_BYTE *__fastcall sub_401C7D(__int64 a1, __int64 a2)
{
unsigned int v2; // eax
unsigned int v3; // eax
_BYTE *result; // rax
unsigned int v5; // [rsp+2Ch] [rbp-4h]
unsigned int v6; // [rsp+2Ch] [rbp-4h]
unsigned int v7; // [rsp+2Ch] [rbp-4h]
unsigned int i; // [rsp+2Ch] [rbp-4h]

v5 = *(_DWORD *)(a1 + 64);
if ( v5 > 0x37 )
{
v7 = v5 + 1;
*(_BYTE *)(a1 + *(unsigned int *)(a1 + 64)) = 0x80;
while ( v7 <= 0x3F )
{
v3 = v7++;
*(_BYTE *)(a1 + v3) = 0;
}
sub_401710(a1, a1);
memset((void *)a1, 0, 0x38ui64);
}
else
{
v6 = v5 + 1;
*(_BYTE *)(a1 + *(unsigned int *)(a1 + 64)) = 0x80;
while ( v6 <= 0x37 )
{
v2 = v6++;
*(_BYTE *)(a1 + v2) = 0;
}
}
*(_QWORD *)(a1 + 72) += (unsigned int)(8 * *(_DWORD *)(a1 + 64));
*(_BYTE *)(a1 + 63) = *(_QWORD *)(a1 + 72);
*(_BYTE *)(a1 + 62) = BYTE1(*(_QWORD *)(a1 + 72));
*(_BYTE *)(a1 + 61) = BYTE2(*(_QWORD *)(a1 + 72));
*(_BYTE *)(a1 + 60) = BYTE3(*(_QWORD *)(a1 + 72));
*(_BYTE *)(a1 + 59) = BYTE4(*(_QWORD *)(a1 + 72));
*(_BYTE *)(a1 + 58) = (unsigned __int16)WORD2(*(_QWORD *)(a1 + 72)) >> 8;
*(_BYTE *)(a1 + 57) = BYTE6(*(_QWORD *)(a1 + 72));
*(_BYTE *)(a1 + 56) = HIBYTE(*(_QWORD *)(a1 + 72));
result = (_BYTE *)sub_401710(a1, a1);
for ( i = 0; i <= 3; ++i )
{
*(_BYTE *)(a2 + i) = *(_DWORD *)(a1 + 80) >> (-8 * i + 24);
*(_BYTE *)(i + 4 + a2) = *(_DWORD *)(a1 + 84) >> (-8 * i + 24);
*(_BYTE *)(i + 8 + a2) = *(_DWORD *)(a1 + 88) >> (-8 * i + 24);
*(_BYTE *)(i + 12 + a2) = *(_DWORD *)(a1 + 92) >> (-8 * i + 24);
*(_BYTE *)(i + 16 + a2) = *(_DWORD *)(a1 + 96) >> (-8 * i + 24);
*(_BYTE *)(i + 20 + a2) = *(_DWORD *)(a1 + 100) >> (-8 * i + 24);
*(_BYTE *)(i + 24 + a2) = *(_DWORD *)(a1 + 104) >> (-8 * i + 24);
result = (_BYTE *)(i + 28 + a2);
*result = *(_DWORD *)(a1 + 108) >> (-8 * i + 24);
}
return result;
}

image.png
image.png
这个函数中也有指向sub_401710的函数

  • Title: moeCTF20221114
  • Author: Juana_2u
  • Created at : 2023-09-11 15:08:10
  • Updated at : 2023-10-13 21:35:09
  • Link: https://juana-2u.github.io/2023/09/11/moeCTF20221114/
  • License: This work is licensed under CC BY-NC-SA 4.0.