2024数信杯逆向rrrcccc题解

今日份学习:RC4算法,SMC

1、首先查壳分析:

发现是upx的壳

放到工具里面去脱,但是脱不了,所以应该是文件头被修改了,两种办法,一个是手工脱壳,第二种是修改文件头

1、修改文件头:

用010editor打开发现搜哦有的upx都是小写,将其改为大写发现可以使用工具脱了

发现已经没有了壳的存在,所以脱壳成功

2、手脱:

使用ESP定律

还是开头的pushad,此时看到右边的寄存器都是红色的,点一下F8,观察到此时只有ESP[变红,我们在ESP处下硬件访问断点,然后F9运行,观察

此时看到有一个jmp,所以单步F8到此处,然后就是oep了

下面就是我们熟悉的界面了,在此处进行脱壳

然后手脱完成,生成脱壳文件,接下来就是ida分析了

2、SMC

SMC:

SMC是一种动态代码加密技术,在程序运行的过程中进行解密,因为未解密之前的代码是我们无法读懂的,所以间接的保护了代码。

SMC的实现,可以使用两个函数给于这个text段写入的权限

1在linux系统中,可以通过mprotect函数修改目标内存的权限

2在Windows系统中,VirtualProtect函数实现内存权限的修改

SMC的解密:

1.使用idapython脚本进行解密

2、动态调试到代码解密处

下面是一个大佬对SMC更深入地讲解:

探究SMC局部代码加密技术以及在CTF中的运用 - SecPulse.COM | 安全脉搏

所以看我们这个main函数,我们知道他就是SMC,下面的两个异或就是对其的解密。

这里我使用动调的方式进行解密

1、在解密完成的地方进行下断点:

我选择在这个函数内部下断点,因为里面有个反调试,我们需要把他给过了

2、动调开始:

上面这个就是解密的地方,现在他还不是我们可以反编译的函数,我们主动创建一下,首先对这些数据点击U,重新定义,然后点击C转换为代码,最后点击P生成函数之后F5

下面的代码就是我们熟悉的了,我们可以发现这是一个RC4加密方式,

在RC里面有一个疑异或加密,在外面又有一个异或加密,最后一个比较,所以我们就知道了密文

RC4加密:

#include <stdio.h>
#include <string.h>

void rc4_init(unsigned char* s,char* key,unsigned long len);
void rc4_crypt(unsigned char* s,char* data,unsigned long len); 
int main(){
	unsigned char s[256]={0};
	char key[256]={0};
	char data[256]={0};
	printf("请输入密钥:");
	scanf("%s",key);
	unsigned long length = strlen(key);
	rc4_init(s,key,length);
	printf("请输入密文:"); 
	scanf("%s",data);
	rc4_crypt(s,data,length);
	printf("\n加/解密结果:\n%s",data);
	return 0;
}

void rc4_init(unsigned char* s,char* key,unsigned long len){
	int i = 0;
	int j = 0;
	unsigned char k[256]={0};
	unsigned char temp =0;
	for(i = 0;i < 256;i++){
		s[i]=i;                       //升序初始化S向量 
		k[i]=key[i%len];            //用key生成 ,实际上就是T向量
 
	}
	for(i = 0;i < 256;i++){
		j=(j+s[i]+k[i])%256;
		temp = s[i];
		s[i] = s[j];
		s[j] = temp;
	} 
}
void rc4_crypt(unsigned char* s,char* data,unsigned long len){
	int i = 0, j = 0,t = 0;
	unsigned long k=0;
	unsigned char temp;
	for(k=0;k<len;k++){
		i=(i+1)%256;
		j=(j+s[i])%256;
		temp = s[i];
		s[i]=s[j];
		s[j]=temp;
		t=(s[i]+s[j])%256;
		data[k]^=s[t];
	}
}

对于RC4一般都是经过了修改的,所以我们不可能直接进行解密,对于RC4我们可以通过动调去得他最后那一步异或的值然后与密文异或得到原文的方法解决。

所以,秘钥流就在al或者edx里面,我们下断点然后F8  F9一个一个取,确保输入的数据与密文长度相等

最后还有一个异或,那个密文直接dump就行,所以最后得到两个秘钥和密文,我们已经可以进行解密了

解密代码:

x='Whatareyourencryption&decryptionbasics'
key1=bytearray([0x1C,0xCB,0xF5,0x53,0x91,0xcc,0x3B,0x66,0x4,0x7D,0xBA,0xD2,0x56,0xCE,0x14,0xA4,0xE8,0x7F,0xC2,0xc4,0x2b,0x86,0x32,0xf0,0xf7,0xea,0xfb,0xf0,0x78,0x34,0x9a,0x3,0x13,0xa2,0x91,0x37,0x48,0x66])
key2 =bytearray([0x2d,0xcf,0xf5,0x40,0x8b,0xda,0x6d,0x7b,0x9,0x3e,0xf1,0xd6,0xb,0x99,0x7,0xe8,0xa9,0x6f,0x9c,0xce,0x74,0xc4,0x64,0xa6,0xf0,0xae,0xb0,0xb1,0x39,0x64,0xc5,0x55,0x43,0xf4,0x81,0x6e,0x1a,0x68])
flag=''
for i in range(len(key1)):
  flag+=chr(ord(x[i])^key1[i]^key2[i])
print(flag)

flag{d3db69a34a51d7e1d23d621590827c01}

至此,解决,从此题了解到了RC4的解密和MSC的解密

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值