REVERSE checkin 直接先查壳放入64位的ida中,找相应的flagmoectf{Enjoy_yourself_in_Reverse_Engineering!!!}
begin 查看程序信息之后用ida64位打开,F5查看主函数 读伪代码,发现是输入的Str内容进行与0x19异或之后与最后的Str2的内容进行对比,打开的Str2的密文: 导出数据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)
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 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 )] 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: 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函数和功能入口。
C#逆向可以使用dnspy进行反编译
C#逆向常见的三种情况
.net app 逆向,原理分析或修改,功能增加(目标exe,dll)
com组件dll,原理分析或修改,功能增加(目标dll)
.net visual basic 脚本分析(病毒行为检测)
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 private static void Main (){ int 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 }; 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(); byte [] byteArray = Encoding.ASCII.GetBytes(input); for (int i = 0 ; i < input.Length; i++) { if (flag[i] == (int )byteArray[i]) { f++; } } if (f == flag.Length) { Console.WriteLine("TTTTTQQQQQQLLLLLLL!!! This is your flag!" ); return ; } Console.WriteLine("QwQ, plz try again." ); }
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)
(小声逼逼:官方的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 ]; puts ("I poisoned the program... Can you reverse it?!" ); puts ("Come on! Give me your flag:" ); sub_4012A0("%s" , (char )v4); if ( strlen (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进行字符的加密,最后和unk_403000进行对比 双击之后,展开发现都是飘红的,一串杂乱的数据无法识别–>因为ida的分析被花指令扰乱了。在飘红的loc_40100D地方按U键,将代码转为未定义的数据,在unk_40100E处按C转为代码。 然后在unk_40100E处按C转代码,40100D处是无用指令,扰乱了ida的分析,patch掉没有用的指令
patch的方法:
找到飘红处:U–>代码转为未定义数据
unk_……函数 C转为代码
选中 jz jnz db三行指令–>nop 快捷键:ctrl+alt+k
db指令 C–>转为代码
push处 P–>创建函数
F5查看伪代码
选中这3句话,按下ctrl+alt+k,输入nop点patch,40100D处的0x90也按C转为代码,然后在 loc_401000处按P创建函数,F5就可以得到伪代码。可以看出loc_401000是一个加的操作a1[i] += a1[i + 1]
同样的patch方法将loc_401080函数也整出来。可以看出是一个移位的函数a1[i] = (16 * a1[i]) | ((int)(unsigned __int8)a1[i] >> 4)
将每一个字节的前4bit放到后 4bit,后4bit放到前4bit。 最后与unk_403000函数的数据进行比较,将数据导出
报错:ValueError: bytes must be in range(0, 256) 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)): enc[i] = ((enc[i]>>4 )|(enc[i]<<4 )) &0xff for i in range (len (enc)-1 ,0 ,-1 ): enc[i-1 ]-=enc[i] print (bytes (enc))
花指令介绍:什么是花指令 &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 ]; int v5; int v6; int j; int i; sub_401800(argc, argv, envp); v6 = strlen (::Str); 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); v5 = strlen (Str); for ( i = 0 ; i < v5; ++i ) Str[i] ^= ::Str[i % v6]; for ( j = 0 ; j < v5; ++j ) Str[j] += 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
分别对应改为我们能看清楚的函数名 官方给的wp中写道是:双击已经改过(::Str)的key字符是yunzh1jun
,在line17行下断点进行调式
啊~G掉了,ida动调不了,需要自己修一下,报错如下 官网下载bochs:http://sourceforge.net/projects/bochs/files/bochs/ 默认下载的地址就好 C:\Program Files\Bochs-2.7 额额额 没好 呜呜呜~~ 害,我发现这个家伙,服了。 是用这个家伙来构建一个虚拟机一样的家伙来动调代码,完全可以用本地windows来动调的! 这里选择的是Remote Windows debugger
而不是Local Windows debugger
出现动调之后界面之后,双击key发现,这里的key值变掉了。 (数据全部选中之后按C转为代码) key值即为yunzh1junTCL,trackYYDS
关键的一步将真正的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 ]; int input_len; int key_len; int j; int i; 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 ]; char input[108 ]; int i; 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) ) puts ("\nGood job!!! You know UPX and hash!!!" ); else puts ("\nQwQ. Something wrong. Please try again. >_<" ); return 0 ; }
读代码操作 大概都是可以看懂的
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; char v3[112 ]; char Buf2[44 ]; int k; 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, 32u i64) == 0 ; }
其中存有好几个函数继续加密
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; *(_DWORD *)(a1 + 64 ) = 0 ; *(_QWORD *)(a1 + 72 ) = 0 i64; *(_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; }
这里将数值都换成了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; unsigned int i; 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 ) += 512 i64; *(_DWORD *)(a1 + 64 ) = 0 ; } } return result; }
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; int v3[64 ]; int v4; int v5; unsigned int v6; unsigned int i; int v8; int v9; int v10; int v11; int v12; int v13; int v14; int v15; 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; unsigned int v3; _BYTE *result; unsigned int v5; unsigned int v6; unsigned int v7; unsigned int i; 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 , 0x38 ui64); } 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; }
这个函数中也有指向sub_401710的函数