2023春秋杯春季赛WP-REVERSE(AK)

news/2024/11/23 5:51:39/

REVERSE

    • sum
    • Poisoned_tea_CHELL
    • BWBA
    • Pytrans
    • Emoji Connect
    • OldSymbolicCode

在这里插入图片描述

浅浅写一下RE的WP~

sum

在这里插入图片描述

根据代码,可以看出程序只能输入数字,判断matrix数组对应下标的值是否为0,如果为0,则可以输入一个字符,根据代码逻辑,可以把matrix数组看成一个 9 * 9 的二维数组,将matrix数组提取出来看看
在这里插入图片描述
转换成 9 * 9 矩阵

5 3 0 0 7 0 0 0 0 
6 0 0 1 9 5 0 0 0 
0 9 8 0 0 0 0 6 0 
8 0 0 0 6 0 0 0 3 
4 0 0 8 0 3 0 0 1 
7 0 0 0 2 0 0 0 6 
0 6 0 0 0 0 2 8 0 
0 0 0 4 1 9 0 0 5 
0 0 0 0 8 0 0 7 9

然后verify()函数对数组进行检查,可以发现这是个数独游戏,可以用在线网站一把梭

https://shudu.gwalker.cn/

在这里插入图片描述
将填上的数字依次输入即得flag
在这里插入图片描述

Poisoned_tea_CHELL

从名字可以猜到是个tea算法
在程序中也找到了相应的tea算法,
在这里插入图片描述
在这里插入图片描述
但是数据不知道,所以动调看看
先在ubuntu里运行linux_server64,再运行程序,记得要用root权限,不然可能会有问题
在这里插入图片描述
这里用的是 Debugger->Attach->Remote Linux debugger方法动调
在这里插入图片描述
选择对应的进程即可调试
在这里插入图片描述
在程序里输入2后,狂按F8半分钟左右,来到一处call函数,程序会让输入flag
查看函数,这下数据也有了
在这里插入图片描述
在这里插入图片描述
脚本一把梭,这里有个坑,加密轮数为36轮

#include<stdio.h>
#include<stdlib.h>void encode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int64 i; // [rsp+8h] [rbp-18h]unsigned int v4; // [rsp+14h] [rbp-Ch]unsigned int v5; // [rsp+18h] [rbp-8h]unsigned int v6;int n=0;for(x=0;x<=5;x++){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0;i=0;do{i++;v6 += (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);v4 -= 0x41104111;v5 += (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);}while(i<36);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
//	  printf("\n0x%X\n",v4);}
} void decode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int64 i; // [rsp+8h] [rbp-18h]unsigned int v4; // [rsp+14h] [rbp-Ch]unsigned int v5; // [rsp+18h] [rbp-8h]unsigned int v6;for(x=5;x>=0;x--){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0xD9B6D99C;i=0;do{i++;v5 -= (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);v4 += 0x41104111;v6 -= (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);}while(i<36);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
//	  printf("\n0x%X\n",v4);}
} int main()
{unsigned int v[12]={0xECFDA301,0x61BECDF5,0xB89E6C7D,0xCE36DC68,0x4B6E539E,0x642EB504,0x54F9D33C,0x6D06E365,0xEA873D53,0xA4618507,0xD7B18E30,0xC45B4042};unsigned int key[4]={5,2,9,7};int i;decode(v,key);for(i=0;i<12;i++){printf("%c",v[i]&0xff);printf("%c",(v[i]&0xff00)%0xff);printf("%c",(v[i]&0xff0000)%0xffff);printf("%c",(v[i]&0xff000000)%0xffffff);//Thisisflag{cdfec405-3f4b-457e-92fe-f6446098ee2e}}printf("\n");for(i=0;i<12;i++){printf("0x%.8X ",v[i]);}printf("\n");encode(v,key);for(i=0;i<12;i++){printf("0x%.8X ",v[i]);}system("pause");return 0;
}

BWBA

main->encrypt()函数
主要加密代码
在这里插入图片描述
可以发现这是个DCT离散余弦变换
用python的cv2库可以直接解

import numpy as np
import cv2x = np.array([370.75,234.362,-58.0834,59.8212,88.8221,-30.2406,21.8316,49.9781,-33.5259,2.69675,43.5386,-30.2925,-28.0754,27.593,-2.53962,-27.1883,-5.60777,-0.263937,6.80326,8.03022,-6.34681,-0.89506,-6.80685,-13.6088,27.0958,29.8439,-21.7688,-20.6925,-13.2155,-37.0994,2.23679,37.6699,-3.5,9.85188,57.2806,13.5715,-20.7184,8.6816,3.59369,-4.5302,4.22203,-28.8166,-23.695,31.2268,6.58823,-39.9966,-20.7877,-19.7624,-22.031,16.3285,2.07557,-26.2521,16.1914,18.3976,-26.9295,3.03769,41.0412,20.2598,14.991,6.99392,-22.3752,-7.24466,8.96299,-10.4874], dtype=np.float64)
x = cv2.idct(x)
x = x.ravel()
flag=''for i in range(len(x)):flag+=chr(round(x[i]))
print(flag)#flag{9ab488a7-5b11-1b15-04f2-c230704ecf72}

Pytrans

根据题目可知这是个python打包的程序
用 python3.8,pyinstxtractor.py 解包
在这里插入图片描述
用uncompyle6反编译run.pyc
关键代码
在这里插入图片描述
主要逻辑,首先输入十个数,然后调用mylib.so文件里的check函数
在这里插入图片描述
用z3解一下

from z3 import *a1 = [BitVec('u%d' % i, 16) for i in range(0, 10)]
solver = Solver()solver.add(-27 * a1[7]+ -11 * a1[6]+ 16 * a1[5]+ a1[0]+ 2 * a1[1]- a1[2]+ 8 * a1[3]- 14 * a1[4]+ 26 * a1[8]+ 17 * a1[9] == 0x387E)
solver.add(-30 * a1[8] + 13 * a1[5] + a1[3] + a1[1] + 2 * a1[0] - 15 * a1[4] - 24 * a1[6] + 16 * a1[7] + 36 * a1[9] == -2591)
solver.add(16 * a1[6]+ -21 * a1[5]+ 7 * a1[3]+ 3 * a1[1]- a1[0]- a1[2]+ 12 * a1[4]- 23 * a1[7]+ 25 * a1[8]- 18 * a1[9] == 2517)
solver.add(-6 * a1[6] + 2 * a1[2] - a1[1] + 2 * a1[5] + 9 * a1[7] + 2 * a1[8] - 5 * a1[9] == 203)
solver.add(-5 * a1[8] + 6 * a1[7] + 3 * a1[1] - a1[3] - a1[5] + a1[6] + 5 * a1[9] == 3547)
solver.add(-9 * a1[8] + a1[4] + a1[2] + a1[7] - 5 * a1[9] == -7609)
solver.add(2 * a1[5] + -a1[3] - a1[4] + a1[8] + 6 * a1[9] == 4884)
solver.add(a1[6] - a1[7] + 2 * a1[8] == 1618)
solver.add(a1[4] - a1[6] + 2 * a1[9] == 1096)
solver.add(a1[8] + a1[4] + a1[3] + a1[2] + a1[1] + a1[0] - a1[5] - a1[6] - a1[7] - a1[9] == 711)
solver.add(2 * (2 * a1[4] + a1[3]) + 5 * a1[5] == 7151)if solver.check()==sat:result = solver.model()print(result)

得到十个数

511 112 821 949 517 637 897 575 648 738

输入这十个数后,发现后面还有东西
在这里插入图片描述
于是回去看看代码

decoded_data = base64.b64decode(scrambled_code_string)
uncompressed_data = zlib.decompress(decoded_data)
exec(__import__('marshal').loads(uncompressed_data))

这段代码可以执行一个经过混淆的 Python 代码字符串,它包含了编码后的字符串,使用 base64 进行解码,然后使用 zlib 进行解压缩。解压缩的结果是一个经过 Python 自带的 marshal 库序列化后的对象。最后,使用 exec 进行执行。

加两行代码将uncompressed_data的数据输出看看

decoded_data = base64.b64decode(scrambled_code_string)
uncompressed_data = zlib.decompress(decoded_data)
for i in uncompressed_data:print(hex(i)[2:].rjust(2,'0'),end='')
exec(__import__('marshal').loads(uncompressed_data))

将十六进制数复制出来,放入010Editor查看下
在这里插入图片描述
可以发现是个缺少文件头的pyc文件
在这里插入图片描述
将run.pyc的文件头复制过来
在这里插入图片描述
uncompyle6 反编译看看,代码

footprint = '3qzqns4hj6\neeaxc!4a-%\nd735_@4l6g\nf1gd1v7hdm\n1+$-953}81\na^21vbnm3!\n-#*f-e1d8_\n2ty9uipok-\n6r1802f7d1\n9wez1c-f{0'
xx0000 = []
footprintlist = footprint.split('\n')
for i in range(len(footprintlist)):xx0000.append(list(footprintlist[i]))
else:def xxxx000x0(num):xx000000 = format(num, '010b')return xx000000oxooxxxxxoooo = []xx0000000 = input("Please enter the previous 10 digits again and ending with '\\n': ").split(' ')if len(xx0000000) == 10:try:for i in xx0000000:oxooxxxxxoooo.append(int(i))except:print('err input!')exit(-1)else:print('err input!')exit(-1)for i in range(len(oxooxxxxxoooo)):oxooxxxxxoooo[i] = list(xxxx000x0(oxooxxxxxoooo[i]))else:xx0000x000 = oxooxxxxxoooox, o = (0, 0)xx00x00x0xxx00 = [(x, o)]xx00x00x0xxx00input = list(input('input maze path:'))count = 0while (x, o) != (9, 9):if count < len(xx00x00x0xxx00input):xx0000x0xxx00 = xx00x00x0xxx00input[count]if xx0000x0xxx00 == 'a':if o > 0 and xx0000x000[x][o - 1] == '0':o -= 1count += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)elif xx0000x0xxx00 == 'd':if o < 9 and xx0000x000[x][o + 1] == '0':count += 1o += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 'w':if x > 0 and xx0000x000[x - 1][o] == '0':count += 1x -= 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 's':if x < 9 and xx0000x000[x + 1][o] == '0':count += 1x += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)print('right! you maybe got it,flag is flag{the footprint of the maze path}')

可以发现是个迷宫题,根据输入的数字生成对应的迷宫,添加两行代码打印迷宫
在这里插入图片描述
迷宫为:

['0', '1', '1', '1', '1', '1', '1', '1', '1', '1']
['0', '0', '0', '1', '1', '1', '0', '0', '0', '0']
['1', '1', '0', '0', '1', '1', '0', '1', '0', '1']
['1', '1', '1', '0', '1', '1', '0', '1', '0', '1']
['1', '0', '0', '0', '0', '0', '0', '1', '0', '1']
['1', '0', '0', '1', '1', '1', '1', '1', '0', '1']
['1', '1', '1', '0', '0', '0', '0', '0', '0', '1']
['1', '0', '0', '0', '1', '1', '1', '1', '1', '1']
['1', '0', '1', '0', '0', '0', '1', '0', '0', '0']
['1', '0', '1', '1', '1', '0', '0', '0', '1', '0']

从[0,0]走到[9,9]则通过,路径为

sddsdssdddwwwddsssssaaaaassddsddwdds

在这里插入图片描述
直接修改源代码,按照路径,输出footprint经过的字符

footprint = '3qzqns4hj6\neeaxc!4a-%\nd735_@4l6g\nf1gd1v7hdm\n1+$-953}81\na^21vbnm3!\n-#*f-e1d8_\n2ty9uipok-\n6r1802f7d1\n9wez1c-f{0'
xx0000 = []
footprintlist = footprint.split('\n')
for i in range(len(footprintlist)):xx0000.append(list(footprintlist[i]))
else:def xxxx000x0(num):xx000000 = format(num, '010b')return xx000000for i in xx0000:print(i)print('----------------------------------------------------')oxooxxxxxoooo = []# xx0000000 = input("Please enter the previous 10 digits again and ending with '\\n': ").split(' ')#511 112 821 949 517 637 897 575 648 738xx0000000 = '511 112 821 949 517 637 897 575 648 738'.split(' ')if len(xx0000000) == 10:try:for i in xx0000000:oxooxxxxxoooo.append(int(i))except:print('err input!')exit(-1)else:print('err input!')exit(-1)for i in range(len(oxooxxxxxoooo)):oxooxxxxxoooo[i] = list(xxxx000x0(oxooxxxxxoooo[i]))else:xx0000x000 = oxooxxxxxoooofor i in xx0000x000:print(i)x, o = (0, 0)xx00x00x0xxx00 = [(x, o)]# xx00x00x0xxx00input = list(input('input maze path:'))xx00x00x0xxx00input = list('sddsdssdddwwwddsssssaaaaassddsddwdds')count = 0while (x, o) != (9, 9):if count < len(xx00x00x0xxx00input):xx0000x0xxx00 = xx00x00x0xxx00input[count]if xx0000x0xxx00 == 'a':if o > 0 and xx0000x000[x][o - 1] == '0':o -= 1count += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)elif xx0000x0xxx00 == 'd':if o < 9 and xx0000x000[x][o + 1] == '0':count += 1o += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 'w':if x > 0 and xx0000x000[x - 1][o] == '0':count += 1x -= 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:if xx0000x0xxx00 == 's':if x < 9 and xx0000x000[x + 1][o] == '0':count += 1x += 1xx00x00x0xxx00.append((x, o))else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)else:print('wrong!')exit(-1)print('right! you maybe got it,flag is flag{the footprint of the maze path}')#sddsdssdddwwwddsssssaaaaassddsddwddsflag=''for i in range(len(xx00x00x0xxx00)):flag+=xx0000[xx00x00x0xxx00[i][0]][xx00x00x0xxx00[i][1]]print('flag{'+flag+'}')

Emoji Connect

用dnSpy反编译dll文件
关键代码
在这里插入图片描述
代码有点长(看不懂,直接问gpt~
一段一段问,果然效率比自己看高得多

chatgpt答复:

这段代码是用C#语言编写的,用于在Microsoft Office Excel中创建新的工作表,并将一个48 x 48的数组的值写入到其中。以下是代码中主要的步骤:使用app对象打开Excel并显示该应用程序。
获取当前活动的工作簿并将其赋值给wb对象。
通过调用Sheets属性获取工作簿的第一个工作表,并将其赋值给sheet1对象。
使用双重循环,从数组中取出每个元素并将其写入到工作表中,使用Cells属性和指定的行列来访问单元格,使用SetMember方法将单元格的值设置为数组元素的值。
对范围“A1”到“Y50”应用水平居中对齐。
为工作表的SelectionChange事件添加一个处理程序,该处理程序被称为Select_Unit。
请注意,该代码中还有一些使用Lambda表达式的技巧,以及在静态类中使用的匿名类型。此外,代码还使用了Interop技术,这是一种允许.NET应用程序与COM组件进行交互的方法。
这段代码是在前面的代码中注册的SelectionChange事件的处理程序。当用户选择一个或多个单元格时,将会调用该方法。首先,代码创建一个列表对象,并使用foreach循环将Target参数中的每个单元格添加到列表中。接下来,代码检查所选单元格的数量是否为2,如果是,则使用动态绑定调用一个委托来更改一个名为obj2的对象的值。如果所选单元格的数量不是2,则直接将flag变量赋值给obj2。整段代码复杂度比较高,使用了大量的动态绑定 (dynamic binding) 技术,这是一种在运行时确定调用哪个方法或访问哪个属性的技术。
继续上面的代码,这部分应该是在处理前面的代码中通过动态绑定创建的obj2对象。如果obj2的值为false,则调用Game.<>o__6.<>p__3委托并使用二元逻辑运算 (Logical AND) 将其与list[1].get_Value(Type.Missing)的比较结果进行 AND 操作,然后将结果赋值给obj4。否则,obj4的值等于obj3。整段代码中的目的是跟踪用户选择的单元格是否跨越了两个单元格,如果两个单元格都被选中,则采取一些特殊的操作。由于代码中使用了大量的动态绑定技术,因此可读性不是很好。这也是建议在代码编写过程中尽量避免使用动态绑定的原因之一。
这段代码继续处理前面的代码中通过动态绑定创建的obj4对象。如果obj4的值为false,则调用Game.<>o__6.<>p__6委托并使用二元逻辑运算 (Logical AND) 将其与指定的字符串 “\ud83d\udca5” 进行比较,并将结果赋值给obj6。无论obj4的值是什么,最终的结果都将保存在obj6中。
这段代码继续处理前面的代码中通过动态绑定创建的obj6对象。如果obj6的值为false,则调用Game.<>o__6.<>p__9委托并使用二元逻辑运算 (Logical AND) 将其与指定的字符串 “\ud83d\udca5” 进行比较,并将结果赋值给arg5。无论obj6的值是什么,最终的结果都将保存在arg5中。
这段代码判断用户选择的单元格中是否有两个单元格被同时选中,且这两个单元格中是否都有指定的字符串 “\ud83d\udca5”,如果满足条件,则将这两个单元格中的值交换,并且计算单元格中数字的总和。首先,代码调用先前为true/false操作创建的动态绑定委托,并使用逻辑AND运算符检查arg5的值。如果arg5的值为true,则继续执行后面的操作。然后,代码创建一个表示两个字符Unicode码点的数组,并使用LINQ查询语句将其值设置为list[1].get_Value()中字符的Unicode码点。接下来,代码计算这两个字符所表示的Unicode码点。接下来,代码使用已计算出的Unicode码点,从number数组中减去这两个单元格的行和列的乘积。最后,代码使用交换法将两个单元格中的值互换,并调用check方法重新计算单元格中数字的总和。总的来说,这段代码的主要作用是处理用户在Excel中选择单元格时所做的操作,并将它们转换为对应的计算步骤和结果。
这段代码的主要功能是检查单元格中的数字是否符合要求,并根据结果显示消息框。代码中使用两层循环访问名为sheet1的Excel工作表中的48×48个单元格。然后,代码创建两个动态绑定委托,将单元格的值与指定的字符串 “\ud83d\udca5” 进行比较。如果两个字符相等,则返回。如果所有单元格中都不包含字符串 “\ud83d\udca5”,则显示一个消息框。该消息框将number数组中存储的数字数组转换为ASCII码,并显示在消息框中。总的来说,这段代码的主要作用是检查Excel中的单元格是否符合要求,并在单元格中放置了正确的字符和数字,以帮助用户完成谜题。
这里的 array[0] 和 array[1] 是一个长度为2的整数数组,它存储了一个 Unicode 字符的 UTF-16 编码,以便将其转换为 Unicode 码点。在 UTF-16 编码中,基本多文种平面(BMP)中的每个字符由两个 16 位编码(也称为编码点)表示。第一个编码点使用高位编码(high surrogate),其范围为 0xD800~0xDBFF,第二个编码点使用低位编码(low surrogate),其范围为 0xDC00~0xDFFF。这意味着一个字符的 UTF-16 编码可以表示为两个 16 位编码的组合,这两个编码分别存储在数组中。因此,代码中的 array[0] 存储高位编码,array[1] 存储低位编码。
list[0]list[1] 分别代表 Excel 表格中的两个单元格。 list[0] 表示第一个单元格,list[1] 表示第二个单元格。

总的来说,我的理解是这段代码的作用类似于连连看,一样的数据才能消掉,然后根据消掉的数据进行计算,主要代码

num = (array[0] - 55296) * 1024 + array[1] - 56320 + 65536 - 128512;
this.number[num] -= (list[1].Row - 1) * (list[1].Column - 1);
this.number[num] -= (list[0].Row - 1) * (list[0].Column - 1);

数据太长了,就不放了,可以自己转一下

array=[]
for i in range(48):array.append([0]*48)array[0][0] = "d83dde08";
array[0][1] = "d83dde11";
'''......'''
array[47][46] = "d83dde0f";
array[47][47] = "d83dde25";
number=[25588, 31114, 28727, 26722, 24948, 25135, 25480, 29029, 23025, 25775, 15411, 25423, 25202, 30031, 27380, 30734, 25054, 25109, 20741, 28568, 28802, 24591, 26063, 30940, 30375, 19411, 29573, 20845, 27232, 26743, 25779, 24986, 31498, 30978, 22945, 26563, 35012, 29994, 27016, 29535, 21342, 26573, 27569, 25408, 31567, 25503, 21385, 27207]for i in range(48):for j in range(48):x=int(array[i][j][:4],16)y=int(array[i][j][4:],16)num = (x - 55296) * 1024 + y - 56320 + 65536 - 128512number[num]-=i*jprint(bytes(number))
print(b'flag{'+bytes(number)[6:-6]+b'}')

OldSymbolicCode

第一眼看到这样的东西,以为做不了
在这里插入图片描述
直到看到是MS-DOS的应用程序,于是试着用DOSBox运行一下,还真的能运行,果然还是认识的太少了
在这里插入图片描述

安装的话,可以看这篇博客

DOSBox安装

如果要debug的话,记得把debug.exe放到asm文件夹里
然后开始debug硬调
常用命令
在这里插入图片描述
根据调试,代码主要逻辑为

输入一串字符串
判断长度是否等于36,不等于则Try Again!
主要逻辑为:rc4加密,tea加密可以根据以下指令调试
g 02cb
g 02ce
g fffb
g 0177,输出Hello!Your flag is:
g 01a8,输入flag
g 01f3
g 01fb,rc4加密函数
g 01fe,rc4加密后
g 028c,准备tea加密
g 0294,此处存放密文rc4:密钥
hex:30 6c 64 43 6f 6d 70 75 74 65 72 53 65 63 72 65 74
key:0ldComputerSecrettea:
round:32si=e9de   di=a554
mov ax,di
mov cl,04
shl ax,cl  左移四位
mov dx,di
mov cl,05
shr dx,cl 右移五位
xor ax,dx判断是tea算法加密sum=0x9e35
key=[0x4e21,0x7065,0x656e,0x2170]si+=di做运算
sum+=0x9e35
di+=si做运算

先解tea,再rc4解密

#include<stdio.h>
#include<stdlib.h>void encode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int16 i; // [rsp+8h] [rbp-18h]unsigned __int16 v4; // [rsp+14h] [rbp-Ch]unsigned __int16 v5; // [rsp+18h] [rbp-8h]unsigned __int16 v6;for(x=0;x<=16;x++){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0;i=0;do{i++;v6 += (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);v4 += 0x9E35;v5 += (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);}while(i<32);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
//	  printf("\n0x%X\n",v4);}
} void decode(unsigned int *a1, unsigned int *a2)
{int x;unsigned __int16 i; // [rsp+8h] [rbp-18h]unsigned __int16 v4; // [rsp+14h] [rbp-Ch]unsigned __int16 v5; // [rsp+18h] [rbp-8h]unsigned __int16 v6;for(x=0;x<=16;x++){v6 = *(a1+x*2);v5 = *(a1+x*2+1);v4 = 0xC6A0;i=0;do{i++;v5 -= (((v6 >> 5) ^ 16 * v6) + v6) ^ (*(((v4 >> 11) & 3) + a2) + v4);v4 -= 0x9E35;v6 -= (((v5 >> 5) ^ 16 * v5) + v5) ^ (*((v4 & 3) + a2) + v4);}while(i<32);*(a1+x*2) = v6;*(a1+x*2+1) = v5;
//	  printf("\n0x%X\n",v4);}
} int main()
{unsigned int v[18]={0xE3D8,0x97AD,0x0DB4,0xA0A5,0x63E3,0x439C,0x9BC9,0x2685,0x2DEA,0xDF95,0xB288,0x6F18,0x80F3,0xD2CA,0xFF0D,0x5B9B,0x8B65,0xEBAF};unsigned int key[4]={0x4e21,0x7065,0x656e,0x2170};int i;decode(v,key);for(i=0;i<18;i++){printf("%.2x",v[i]&0xff);printf("%.2x",(v[i]&0xff00)/0x100);//dee954a5162e2effe4ad030cbd49c0cd6f495c9822e094767e74da6457b4ef4105a23439,最后rc4解密 }printf("\n");for(i=0;i<18;i++){printf("0x%.4X ",v[i]);}printf("\n");encode(v,key);for(i=0;i<18;i++){printf("0x%.4X ",v[i]);}system("pause");return 0;
}

在这里插入图片描述


http://www.ppmy.cn/news/408756.html

相关文章

asp.net开发wap程序必备:识别来访手机品牌型号 选择自 Qqwwee_Com 的 Blog

我们在开发wap应用程序需要有识别来访手机品牌型号的功能&#xff0c;这样才可以更好的为用户提供更好的个性化服务&#xff0c;比如图片类型、屏幕尺寸、铃声类型等。 http协议中&#xff0c;User-Agent这个标头指示的浏览器信息,文章最后附加了常见的手机User-Agent. 每个厂家…

2023年春秋杯网络安全联赛春季赛 RE复盘(部分待补)

目录 sum Pytrans BWBA Poisoned_tea_CHELL 第一种找程序加密函数的方法 第二种找程序加密函数的方法 解密 这次的春季赛仍是被打爆了&#xff0c;re只做出了一题&#xff0c;发现自己还是太菜了&#xff0c;好在在后期复盘中又收获了许多新知识了&#xff0c;不亏。 su…

Linux检查Docker镜像,容器的磁盘空间

Linux检查Docker镜像,容器的磁盘空间 我从3A平台购买了云服务器&#xff0c;想知道 Docker 在你的 Linux 系统上到底占用了多少空间&#xff1f; 首先&#xff0c;所有Docker 镜像、容器和其他相关程序都位于/var/lib/docker. 你可以检查此目录的大小并获取 Docker 使用的总磁盘…

爬虫-request-模块请求参数

request请求参数 headers 请求头params 请求参数proxies 代理ipcookie web状态信息1 headers 中携带cookie2 cookies参数3 使用session verify 安全验证timeout 网络超时参数retrying 重试次数post/get请求 (params参数) headers 请求头 伪装的更像是一个正常的浏览器在请求服…

docker基础:非root用户操作并将数据目录进行nfs mount

本文记录一下如何使用非root用户进行docker操作&#xff0c;并将数据目录从其他机器进行nfs mount。 场景说明 安装docker所在机器由于磁盘空间不足&#xff0c;将数据目录/var/lib/docker进行mount&#xff0c;使用别的机器的空间。在一些企业中由于标准虚机的大小可能已经规…

如何使用powershell批量创建office 365账号

首先&#xff0c;对powershell做一个简单介绍。 当前powershell有四版本&#xff0c;分别为1.0&#xff0c;2.0&#xff0c;3.0 ,4.0 如果您的系统是window7或者Windows Server 2008&#xff0c;那么PowerShell 2.0已经内置了&#xff0c;可以升级为3.0&#xff0c;4.0。如果您…

网络原理知识点汇总

OSI七层模型 vs. TCP/IP 五层模型&#xff08;有时候也说四层&#xff09;及各层协议 七层&#xff1a;物理层&#xff1a;为数据端设备提供传送数据的通路&#xff0c; IEEE802 数据链路层&#xff1a;提供介质访问和链路管理&#xff0c; ARP&#xff0c;MTU 网络层&#xf…

【OpenStack(Train版)安装部署(十)】之img格式cirros镜像创建多实例分析

文章目录 本文章由公号【开发小鸽】发布&#xff01;欢迎关注&#xff01;&#xff01;&#xff01;1.制作qcow2格式的镜像2.img格式镜像创建实例3.img格式同时创建多个实例4.通过server实例创建新的镜像5.通过日志分析一个server实例的创建过程&#xff08;1&#xff09;nova-…