re 2021强网杯复现

ezmath

64位elf,看起来逻辑挺简单,接受38位的输入

但是,最开始我以为是个很简单的对称加密,仔细看了看比较绕,实现了类似数列的一种吧

v3的初值是在运行中修改了的,静态的时候看着是0.2021

如果直接解密,很容易发现,用不了几轮,v3 的值就溢出了,这里很明显是两位输入用的int16来接受的

结合师傅的wp,发现这里是一个求积分的操作,没看出来,确实厉害

那直接把数据提取出来就行了

def fun(an,i):
    v3=0.0004829108052495089
    an_1=2.718281828459045 -an*i
    if an_1>0 and an_1<0.00015:
        #print(hex(i))
        print(chr(int("0x" + hex(i)[4:6],16)-1), end="")
        print(chr(int("0x" + hex(i)[2:4],16)), end="")

for j in range(len(encode)):
    for i in range(8225,65535):
        fun(encode[j],i)

flag{saam_dim_gei_lei_jam_caa_sin_laa}

longtimeago

有点像一个xtea

for i in range(100):
    a-=0x70C88617
    a&=0xffffffff
    #print(hex(a))
    if a==0xE6EF3D20:
        print(i)

确定轮数为32轮,xtea比较容易识别,但是tea确实有点难看

这里v7+=a3这一行,是加delta的操作

v6=0,a3+v6+4就是0x3D3529BC

这是左移4位

这是右移5位

最后,对tea加密分析的结果是

混淆得太厉害了,只能照着师傅们的wp恢复

其中,每一个加密中有一个额外的xor,还得恢复这个,分别异或的是0xfd,0x1fd,0x3fd,0x7fd

解密代码如下

#include <stdio.h>
#include <stdint.h>


//解密函数
void decrypt_xtea(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
	unsigned int i;
	uint32_t v0 = v[0]^0xfd, v1 = v[1]^0x1fd, delta = 0x70C88617, sum = 0xE6EF3D20;
	for (i = 0; i < num_rounds; i++) {
		v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
		sum += delta;
		v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
	}
	v[0] = v0; v[1] = v1;
}


//加密函数

//解密函数
void decrypt_tea(uint32_t* v, uint32_t* k) {

	uint32_t delta = 0x3D3529BC;
	uint32_t v0 = v[0]^0x3fd, v1 = v[1]^0x7fd, sum = 32*delta, i;
	
	uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
	for (i = 0; i < 32; i++) {
		v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
		v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
		sum -= delta;
	}
	v[0] = v0; v[1] = v1;
}



int main()
{
	// v为要加解密的数据,两个32位无符号整数
	uint32_t v[] = { 
0x1F306772,0xB75B0C29,0x4A7CDBE3,0x2877BDDF,0x1354C485,0x357C3C3A,0x738AF06C,0x89B7F537
 };
	// k为加解密密钥,4个32位无符号整数,密钥长度为128位
	uint32_t k[4] = { 0x0FFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD };
	//uint32_t k[4] = { 2, 0x0FFFD, 0x420800,0 };
	int n = sizeof(v) / sizeof(uint32_t);
	// num_rounds,建议取值为32
	unsigned int r = 32;
	//printf("加密前原始数据:0x%x 0x%x\n", v[0], v[1]);
	//encrypt(r, v, k);
	//printf("加密后的数据:0x%x 0x%x\n", v[0], v[1]);
	decrypt_xtea(32, v, k);
	decrypt_xtea(32, &v[2], k);
	decrypt_tea(&v[4], k);
	decrypt_tea(&v[6], k);
	
	for (int i = 0; i < 8; i++) {
		printf("%X", v[i]);
	}
	printf("\n");
	return 0;
}

CD402B6A139283822F0DEA49E65794356F44EA9B3F56652F2DA39881EC491878

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CVE-2021-28041是一个安全漏洞,它影响了某个软件或系统的特定版本。由于我无法得知你具体指的是哪个软件或系统的CVE-2021-28041漏洞,因此无法提供具体的复现步骤。但是,我可以给你一些一般性的复现漏洞的方法和建议。 要复现CVE-2021-28041漏洞,通常需要以下步骤: 1. 确定受影响的软件或系统版本:首先,你需要确定你使用的软件或系统是否受到CVE-2021-28041漏洞的影响。可以查看相关厂商或组织发布的安全公告或漏洞报告来获取这些信息。 2. 了解漏洞的详细信息:阅读CVE-2021-28041漏洞的详细描述和相关文档,了解漏洞的原理和影响范围。这将帮助你更好地理解漏洞,并为复现做好准备。 3. 搭建实验环境:在一个安全的环境中,搭建一个与受影响软件或系统版本相匹配的实验环境。这可以是一个虚拟机、容器或者专门用于安全测试的实验环境。 4. 复现漏洞:根据漏洞的描述和相关文档,尝试复现CVE-2021-28041漏洞。这可能涉及到构造特定的输入、触发特定的操作或者利用软件或系统中的某个弱点。 5. 验证漏洞:一旦成功复现漏洞,验证漏洞的存在和影响。这可以通过观察系统行为、获取敏感信息或者执行未授权的操作来进行验证。 请注意,复现漏洞是一项敏感的活动,需要在合法授权和合法范围内进行。在进行任何安全测试之前,请确保你已经获得了相关授权,并遵守法律和道德规范。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值