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 的第一个 计数 字符的关系 |
|---|---|
| < 0 | buffer1 小于 buffer2 |
| 0 | buffer1 等同于 buffer2 |
| > 0 | buffer1 大于 buffer2 |
补充:
buffer1 和 buffer2 的第一个 计数 字符并返回指示它们关系的值。 非零返回值的符号是缓冲区中的第一个不同值对之差的符号。
核心
一个是数组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;
v2和v3以及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
本文探讨了一个涉及加密和数组比较的C程序,其中核心是memcmp函数的使用。程序首先检查输入flag的长度,然后使用一个加密算法对输入进行加密,并将加密结果与预设的buf数组进行memcmp比较。memcmp函数用于比较两个缓冲区的内容,返回值表示它们的相对大小。文章详细解释了正确的加密循环实现,并提供了一个示例代码来说明如何避免错误地修改循环变量导致的数组赋值错误。
3511

被折叠的 条评论
为什么被折叠?



