例会作业
2025.11.10
test1:蛇年的本命语言
根据课上的提示,我们逆向得到原py文件

不难看出是z3约束,写出脚本
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
| Python from z3 import *
x = [Int('x_%i' % i) for i in range(30)]
s = Solver()
s.add(7 * x[0] == 504) s.add(9 * x[0] - 5 * x[1] == 403) s.add((2 * x[0] - 5 * x[1]) + 10 * x[2] == 799) s.add(3 * x[0] + 8 * x[1] + 15 * x[2] + 20 * x[3] == 2938) s.add((5 * x[0] + 15 * x[1] + 20 * x[2] - 19 * x[3]) + 1 * x[4] == 2042) s.add((7 * x[0] + 1 * x[1] + 9 * x[2] - 11 * x[3]) + 2 * x[4] + 5 * x[5] == 1225) s.add(11 * x[0] + 22 * x[1] + 33 * x[2] + 44 * x[3] + 55 * x[4] + 66 * x[5] - 77 * x[6] == 7975) s.add(((21 * x[0] + 23 * x[1] + 3 * x[2] + 24 * x[3] - 55 * x[4]) + 6 * x[5] - 7 * x[6]) + 15 * x[7] == 229) s.add((2 * x[0] + 26 * x[1] + 13 * x[2] + 0 * x[3] - 65 * x[4]) + 15 * x[5] + 29 * x[6] + 1 * x[7] + 20 * x[8] == 2107) s.add((10 * x[0] + 7 * x[1] + -9 * x[2] + 6 * x[3] + 7 * x[4] + 1 * x[5] + 22 * x[6] + 21 * x[7] - 22 * x[8]) + 30 * x[9] == 4037) s.add((15 * x[0] + 59 * x[1] + 56 * x[2] + 66 * x[3] + 7 * x[4] + 1 * x[5] - 122 * x[6]) + 21 * x[7] + 32 * x[8] + 3 * x[9] - 10 * x[10] == 4950) s.add((((13 * x[0] + 66 * x[1] + 29 * x[2] + 39 * x[3] - 33 * x[4]) + 13 * x[5] - 2 * x[6]) + 42 * x[7] + 62 * x[8] + 1 * x[9] - 10 * x[10]) + 11 * x[11] == 12544) s.add((((23 * x[0] + 6 * x[1] + 29 * x[2] + 3 * x[3] - 3 * x[4]) + 63 * x[5] - 25 * x[6]) + 2 * x[7] + 32 * x[8] + 1 * x[9] - 10 * x[10]) + 11 * x[11] - 12 * x[12] == 6585) s.add(((((223 * x[0] + 6 * x[1] - 29 * x[2] - 53 * x[3] - 3 * x[4]) + 3 * x[5] - 65 * x[6]) + 0 * x[7] + 36 * x[8] + 1 * x[9] - 15 * x[10]) + 16 * x[11] - 18 * x[12]) + 13 * x[13] == 6893) s.add(((((29 * x[0] + 13 * x[1] - 9 * x[2] - 93 * x[3]) + 33 * x[4] + 6 * x[5] + 65 * x[6] + 1 * x[7] - 36 * x[8]) + 0 * x[9] - 16 * x[10]) + 96 * x[11] - 68 * x[12]) + 33 * x[13] - 14 * x[14] == 1883) s.add((((69 * x[0] + 77 * x[1] - 93 * x[2] - 12 * x[3]) + 0 * x[4] + 0 * x[5] + 1 * x[6] + 16 * x[7] + 36 * x[8] + 6 * x[9] + 19 * x[10] + 66 * x[11] - 8 * x[12]) + 38 * x[13] - 16 * x[14]) + 15 * x[15] == 8257) s.add(((((23 * x[0] + 2 * x[1] - 3 * x[2] - 11 * x[3]) + 12 * x[4] + 24 * x[5] + 1 * x[6] + 6 * x[7] + 14 * x[8] - 0 * x[9]) + 1 * x[10] + 68 * x[11] - 18 * x[12]) + 68 * x[13] - 26 * x[14]) + 15 * x[15] - 16 * x[16] == 5847) s.add((((((24 * x[0] + 0 * x[1] - 1 * x[2] - 15 * x[3]) + 13 * x[4] + 4 * x[5] + 16 * x[6] + 67 * x[7] + 146 * x[8] - 50 * x[9]) + 16 * x[10] + 6 * x[11] - 1 * x[12]) + 69 * x[13] - 27 * x[14]) + 45 * x[15] - 6 * x[16]) + 17 * x[17] == 18257) s.add(((((25 * x[0] + 26 * x[1] - 89 * x[2]) + 16 * x[3] + 19 * x[4] + 44 * x[5] + 36 * x[6] + 66 * x[7] - 150 * x[8] - 250 * x[9]) + 166 * x[10] + 126 * x[11] - 11 * x[12]) + 690 * x[13] - 207 * x[14]) + 46 * x[15] + 6 * x[16] + 7 * x[17] - 18 * x[18] == 12591) s.add((((((5 * x[0] + 26 * x[1] + 8 * x[2] + 160 * x[3] + 9 * x[4] - 4 * x[5]) + 36 * x[6] + 6 * x[7] - 15 * x[8] - 20 * x[9]) + 66 * x[10] + 16 * x[11] - 1 * x[12]) + 690 * x[13] - 20 * x[14]) + 46 * x[15] + 6 * x[16] + 7 * x[17] - 18 * x[18]) + 19 * x[19] == 52041) s.add(((((((29 * x[0] - 26 * x[1]) + 0 * x[2] + 60 * x[3] + 90 * x[4] - 4 * x[5]) + 6 * x[6] + 6 * x[7] - 16 * x[8] - 21 * x[9]) + 69 * x[10] + 6 * x[11] - 12 * x[12]) + 69 * x[13] - 20 * x[14] - 46 * x[15]) + 65 * x[16] + 0 * x[17] - 1 * x[18]) + 39 * x[19] - 20 * x[20] == 20253) s.add((((((((45 * x[0] - 56 * x[1]) + 10 * x[2] + 650 * x[3] - 900 * x[4]) + 44 * x[5] + 66 * x[6] - 6 * x[7] - 6 * x[8] - 21 * x[9]) + 9 * x[10] - 6 * x[11] - 12 * x[12]) + 69 * x[13] - 2 * x[14] - 406 * x[15]) + 651 * x[16] + 2 * x[17] - 10 * x[18]) + 69 * x[19] - 0 * x[20]) + 21 * x[21] == 18768) s.add((((((555 * x[0] - 6666 * x[1]) + 70 * x[2] + 510 * x[3] - 90 * x[4]) + 499 * x[5] + 66 * x[6] - 66 * x[7] - 610 * x[8] - 221 * x[9]) + 9 * x[10] - 23 * x[11] - 102 * x[12]) + 6 * x[13] + 2050 * x[14] - 406 * x[15]) + 665 * x[16] + 333 * x[17] + 100 * x[18] + 609 * x[19] + 777 * x[20] + 201 * x[21] - 22 * x[22] == 111844) s.add((((((((1 * x[0] - 22 * x[1]) + 333 * x[2] + 4444 * x[3] - 5555 * x[4]) + 6666 * x[5] - 666 * x[6]) + 676 * x[7] - 660 * x[8] - 22 * x[9]) + 9 * x[10] - 73 * x[11] - 107 * x[12]) + 6 * x[13] + 250 * x[14] - 6 * x[15]) + 65 * x[16] + 39 * x[17] + 10 * x[18] + 69 * x[19] + 777 * x[20] + 201 * x[21] - 2 * x[22]) + 23 * x[23] == 159029) s.add((((520 * x[0] - 222 * x[1]) + 333 * x[2] + 4 * x[3] - 56655 * x[4]) + 6666 * x[5] + 666 * x[6] + 66 * x[7] - 60 * x[8] - 220 * x[9]) + 99 * x[10] + 73 * x[11] + 1007 * x[12] + 7777 * x[13] + 2500 * x[14] + 6666 * x[15] + 605 * x[16] + 390 * x[17] + 100 * x[18] + 609 * x[19] + 99999 * x[20] + 210 * x[21] + 232 * x[22] + 23 * x[23] - 24 * x[24] == 2762025) s.add(((((1323 * x[0] - 22 * x[1]) + 333 * x[2] + 4 * x[3] - 55 * x[4]) + 666 * x[5] + 666 * x[6] + 66 * x[7] - 660 * x[8] - 220 * x[9]) + 99 * x[10] + 3 * x[11] + 100 * x[12] + 777 * x[13] + 2500 * x[14] + 6666 * x[15] + 605 * x[16] + 390 * x[17] + 100 * x[18] + 609 * x[19] + 9999 * x[20] + 210 * x[21] + 232 * x[22] + 23 * x[23] - 24 * x[24]) + 25 * x[25] == 1551621) s.add((((((777 * x[0] - 22 * x[1]) + 6969 * x[2] + 4 * x[3] - 55 * x[4]) + 666 * x[5] - 6 * x[6]) + 96 * x[7] - 60 * x[8] - 220 * x[9]) + 99 * x[10] + 3 * x[11] + 100 * x[12] + 777 * x[13] + 250 * x[14] + 666 * x[15] + 65 * x[16] + 90 * x[17] + 100 * x[18] + 609 * x[19] + 999 * x[20] + 21 * x[21] + 232 * x[22] + 23 * x[23] - 24 * x[24]) + 25 * x[25] - 26 * x[26] == 948348) s.add(((((((97 * x[0] - 22 * x[1]) + 6969 * x[2] + 4 * x[3] - 56 * x[4]) + 96 * x[5] - 6 * x[6]) + 96 * x[7] - 60 * x[8] - 20 * x[9]) + 99 * x[10] + 3 * x[11] + 10 * x[12] + 707 * x[13] + 250 * x[14] + 666 * x[15] + -9 * x[16] + 90 * x[17] + -2 * x[18] + 609 * x[19] + 0 * x[20] + 21 * x[21] + 2 * x[22] + 23 * x[23] - 24 * x[24]) + 25 * x[25] - 26 * x[26]) + 27 * x[27] == 777044) s.add((((((177 * x[0] - 22 * x[1]) + 699 * x[2] + 64 * x[3] - 56 * x[4] - 96 * x[5] - 66 * x[6]) + 96 * x[7] - 60 * x[8] - 20 * x[9]) + 99 * x[10] + 3 * x[11] + 10 * x[12] + 707 * x[13] + 250 * x[14] + 666 * x[15] + -9 * x[16] + 0 * x[17] + -2 * x[18] + 69 * x[19] + 0 * x[20] + 21 * x[21] + 222 * x[22] + 23 * x[23] - 224 * x[24]) + 25 * x[25] - 26 * x[26]) + 27 * x[27] - 28 * x[28] == 185016) s.add(((((((77 * x[0] - 2 * x[1]) + 6 * x[2] + 6 * x[3] - 96 * x[4] - 9 * x[5] - 6 * x[6]) + 96 * x[7] - 0 * x[8] - 20 * x[9]) + 99 * x[10] + 3 * x[11] + 10 * x[12] + 707 * x[13] + 250 * x[14] + 666 * x[15] + -9 * x[16] + 0 * x[17] + -2 * x[18] + 9 * x[19] + 0 * x[20] + 21 * x[21] + 222 * x[22] + 23 * x[23] - 224 * x[24]) + 26 * x[25] - -58 * x[26]) + 27 * x[27] - 2 * x[28]) + 29 * x[29] == 130106)
if s.check() == sat: m = s.model() for i in range(30): print(f"x[{i}] = {m[x[i]]}") else: print("无解")
|
得到原x对应的ASCII码,再转成字符即可

再分析py文件
1 2
| 111111116257645365477364777645752361 以上这串数字分别对应的是字符的出现次数,比如HZNUCTF各出现一次
|
根据以上规律可以得到最后的flag
1
| HZNUCTF{ad7fa-76a7-ff6a-fffa-7f7d6a}
|
test2:水果忍者
dnspy打开Assembly-CSharp.dll,寻找核心加密,发现是AES,直接Cyberchef一把梭





test3:easyGo
字符串查找flag,寻找可疑字符串,连续两次调用发现判断逻辑
输入处下断点后步行,发现右上角直接出现flag



当然,也可以判断出加密函数,发现是base64加密,寻找字母表



test4:rustapp
查找字符串,动态调试,找到核心判断,得到,当v2为0时,输入正确
又有v2=0,v2=v2|(v15^0x21)
推断出v15^0x21为0,即v15=0x21,即input[i]^rust[i]=0x21
写出脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <bits/stdc++.h> #include <string> using namespace std; int main() { char rust[]="rust_library_core_assert"; char flag[24]; for(int i=0;i<24;i++) { flag[i]=rust[i]^0x21; cout<<flag[i]; } }
|
1
| STRU~MHCS@SX~BNSD~@RRDSU
|
2025.11.17
test1:re1
入口是简单的花指令,去掉花指令,看伪代码
加密两部分,前后换位,异或加密,写出脚本即可


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h> #include <string.h> int main() { unsigned char arr[]="c~scvdzKCEoDEZ[^roDICUMC"; for(int i=0;i<12;i++) { int temp=arr[2*i]; arr[2*i]=arr[2*i+1]; arr[2*i+1]=temp; } for(int i=0;i<strlen(arr);i++) { arr[i]^=0x30; printf("%c",arr[i]); } }
|
test2:easyre
直接UPX脱壳,查找可疑的字符串,发现Part2,左边函数查询part,发现第一部分,得到flag



下面讲怎么手脱
1,运行到4个push的地方,在第二个push指令处,在右下角下八字节访问硬件断点
2,继续运行,发现大跳转,跟进
3,找到OEP,直接dump出来




