难度等级:5

main函数

这个题是一个花指令的题

每个题都要从main函数开始

image-20231017130106964

跟过去看看

D

这里很容易的知道,最后是指向了8D下面那行的地址。

也可以动态的看看

image-20231017130620760

我们知道了在ret后就取call sub_133E31。

中间那一段的代码都没有啥用处。我们nop掉

,因为这里有好多的这种代码,都需要nop掉。

image-20231017130758377

我这里肯定是不完善的。虽然能f5了,但是感觉还是不是很完美。

F5看看

image-20231017130944814

sub_402DEC函数

image-20231017132044861

我这里问了AI:

RC4算法主要包括以下步骤,这些步骤与代码段中的操作相似:

  1. 初始化:通常,RC4算法开始时会进行初始化,以生成一个伪随机的密钥流。在这个过程中,代码段中的 v8v7v6 变量可能对应于RC4算法中的状态向量和S盒初始化。
  2. Key-Scheduling:在RC4中,生成一个伪随机密钥流的关键部分是键调度。在代码段中, v8v7 变量用于索引S盒并交换S盒中的值,这是RC4的关键操作。
  3. 伪随机字节生成:RC4算法使用状态向量和S盒生成伪随机字节,然后使用这些字节与明文进行异或运算,以实现加密操作。在代码段中, v4v5 变量似乎是用于保存从S盒中取出的字节,然后将它们与输入进行异或运算。

虽然这段代码类似于RC4算法,但它可能是RC4的变种或定制版本,因为它不包括典型的密钥调度部分,而是使用 a1 作为状态向量。此外,RC4通常需要输入密钥,而代码段中未提及密钥。

要确定确切的加密算法,需要更多上下文和代码的其他部分。如果您能提供更多相关信息,如密钥管理、初始化过程等,将更有可能确认使用的是哪种加密算法。


对于算法,我还是不太会分析。


用IDApython取出值:

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
# 导入IDApython模块
import idaapi

# 指定起始地址
start_address = 0x00411801

# 初始化一个空字符串来存储结果
result_str = ""

# 循环39次
for i in range(39):
# 使用idaapi函数获取当前地址上的值
value = idaapi.get_byte(start_address)

# 将值添加到结果字符串,以十六进制形式,不包括'0x'前缀,使用空格分隔
result_str += "{:X}".format(value)

# 如果不是最后一次迭代,添加空格
if i < 39:
result_str += " "

# 递增地址
start_address += 7

# 打印结果字符串
print(result_str)

image-20231017131451417

然后rc4在线:

image-20231017131532225