HWS计划 decryption 寒假逆向生涯(17/100)

本文探讨了一个涉及加密和数组比较的C程序,其中核心是memcmp函数的使用。程序首先检查输入flag的长度,然后使用一个加密算法对输入进行加密,并将加密结果与预设的buf数组进行memcmp比较。memcmp函数用于比较两个缓冲区的内容,返回值表示它们的相对大小。文章详细解释了正确的加密循环实现,并提供了一个示例代码来说明如何避免错误地修改循环变量导致的数组赋值错误。

decryption

前奏

在这里插入图片描述
没法搞,直接拖ida

全局

在这里插入图片描述

首先输入flag,然后一个if判断一下长度是否符合,不符合直接结束
在这里插入图片描述
然后再new处一个数组,接着一个加密函数,把加密后的存放在new出来的数组里,
在这里插入图片描述
最后把加密后的和已知数组buf进行比较,符合的话则成功
在这里插入图片描述

这个函数memcmp以前我在博客里写过,这里,再给大家写一遍。

int memcmp(
   const void *buffer1,
   const void *buffer2,
   size_t count
);

参数

buffer1:第一个缓冲区。

buffer2:第二个缓冲区。
count:要比较的字符数。 (比较 wmemcmp) 的 memcmp、宽字符的字节数。

返回值

返回值Buf1 和 buf2 的第一个 计数 字符的关系
< 0buffer1 小于 buffer2
0buffer1 等同于 buffer2
> 0buffer1 大于 buffer2

补充
buffer1buffer2 的第一个 计数 字符并返回指示它们关系的值。 非零返回值的符号是缓冲区中的第一个不同值对之差的符号。

核心

一个是数组buf(数组直接通过hex图里面直接拷贝出来,然后加上0x即可),另一个是加密函数encrypt
在这里插入图片描述

char a[]={ 0x12, 0x45, 0x10, 0x47, 0x19, 0x49, 0x49, 0x49,  0x1A, 0x4F, 0x1C, 0x1E, 0x52, 0x66, 0x1D, 0x52,
	0x66, 0x67, 0x68, 0x67, 0x65, 0x6F ,0x5F, 0x59,  0x58, 0x5E, 0x6D, 0x70, 0xA1, 0x6E, 0x70, 0xA3 };

在这里插入图片描述

 v7 = a2[i];
    v6 = i;
    do
    {
      v4 = 2 * (v6 & v7);
      v7 ^= v6;
      v6 = v4;
    }
    while ( v4 );
    result = &a1[i];
    a1[i] = v7 ^ 0x23;

v2v3以及result没用,就用来混淆

注意

那个i值一定要赋给一个字符,然后再用字符进行while循环的变更,否则的话把i值改变了,下面然后进行数组赋值时就出错了。

错误示范:

		do {
			d ^=  char(i);
			c = 2 * (d &  char(i));
			 i = c&0xff;
		} while (c);

正确示范:

	e = char(i);
		do {
			d ^= e;
			c = 2 * (d & e);
			e = c&0xff;
		} while (c);

代码

#include<iostream>
using namespace std;
int main() {
	char a[]={ 0x12, 0x45, 0x10, 0x47, 0x19, 0x49, 0x49, 0x49,  0x1A, 0x4F, 0x1C, 0x1E, 0x52, 0x66, 0x1D, 0x52,
	0x66, 0x67, 0x68, 0x67, 0x65, 0x6F ,0x5F, 0x59,  0x58, 0x5E, 0x6D, 0x70, 0xA1, 0x6E, 0x70, 0xA3 };
	char b[32];
	char c;
	char d;
	char e;
	for (int i = 0; i <= 31; ++i) {
		d=a[i] ^ 0x23;
		e = char(i);
		do {
			d ^= e;
			c = 2 * (d & e);
			e = c&0xff;
		} while (c);
		b[i] = d;
		
	}
	
	for (int i = 0; i <= 31; i++) {
		cout << b[i];
	}
}

在这里插入图片描述

1e1a6edc1c52e80b539127fccd48f05a

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值