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

在这里插入图片描述

浅浅写一下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 cv2

x = 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 xx000000


    oxooxxxxxoooo = []
    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 = oxooxxxxxoooo
        x, o = (0, 0)
        xx00x00x0xxx00 = [(x, o)]
        xx00x00x0xxx00input = list(input('input maze path:'))
        count = 0
        while (x, o) != (9, 9):
            if count < len(xx00x00x0xxx00input):
                xx0000x0xxx00 = xx00x00x0xxx00input[count]
                if xx0000x0xxx00 == 'a':
                    if o > 0 and xx0000x000[x][o - 1] == '0':
                        o -= 1
                        count += 1
                        xx00x00x0xxx00.append((x, o))
                    else:
                        print('wrong!')
                        exit(-1)
                elif xx0000x0xxx00 == 'd':
                    if o < 9 and xx0000x000[x][o + 1] == '0':
                        count += 1
                        o += 1
                        xx00x00x0xxx00.append((x, o))
                    else:
                        print('wrong!')
                        exit(-1)
                else:
                    if xx0000x0xxx00 == 'w':
                        if x > 0 and xx0000x000[x - 1][o] == '0':
                            count += 1
                            x -= 1
                            xx00x00x0xxx00.append((x, o))
                        else:
                            print('wrong!')
                            exit(-1)
                    else:
                        if xx0000x0xxx00 == 's':
                            if x < 9 and xx0000x000[x + 1][o] == '0':
                                count += 1
                                x += 1
                                xx00x00x0xxx00.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 xx000000

    for 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 738
    xx0000000 = '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 = oxooxxxxxoooo
        for i in xx0000x000:
            print(i)
        x, o = (0, 0)
        xx00x00x0xxx00 = [(x, o)]
        # xx00x00x0xxx00input = list(input('input maze path:'))
        xx00x00x0xxx00input = list('sddsdssdddwwwddsssssaaaaassddsddwdds')
        count = 0
        while (x, o) != (9, 9):
            if count < len(xx00x00x0xxx00input):
                xx0000x0xxx00 = xx00x00x0xxx00input[count]
                if xx0000x0xxx00 == 'a':
                    if o > 0 and xx0000x000[x][o - 1] == '0':
                        o -= 1
                        count += 1
                        xx00x00x0xxx00.append((x, o))
                    else:
                        print('wrong!')
                        exit(-1)
                elif xx0000x0xxx00 == 'd':
                    if o < 9 and xx0000x000[x][o + 1] == '0':
                        count += 1
                        o += 1
                        xx00x00x0xxx00.append((x, o))
                    else:
                        print('wrong!')
                        exit(-1)
                else:
                    if xx0000x0xxx00 == 'w':
                        if x > 0 and xx0000x000[x - 1][o] == '0':
                            count += 1
                            x -= 1
                            xx00x00x0xxx00.append((x, o))
                        else:
                            print('wrong!')
                            exit(-1)
                    else:
                        if xx0000x0xxx00 == 's':
                            if x < 9 and xx0000x000[x + 1][o] == '0':
                                count += 1
                                x += 1
                                xx00x00x0xxx00.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}')#sddsdssdddwwwddsssssaaaaassddsddwdds
        
        flag=''
        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 - 128512
        number[num]-=i*j

print(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:0ldComputerSecret

tea:
round:32

si=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;
}

在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值