*ctf-NaCl

不会去花就很难受,看了好久才手动还原出来C语言代码
加密和解密都在这里了

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

//
unsigned int ExchangeBit(unsigned int data){
	unsigned int ret = 0;
	ret |= (data & 0xff) << 24;
	ret |= ((data >> 8) & 0xff) << 16;
	ret |= ((data >> 16) & 0xff) << 8;
	ret |= ((data >> 24) & 0xff) << 0;
	return ret;
}

unsigned int Ror(unsigned int data, unsigned int count){
	__asm{
		mov eax, [data]
			mov cl, byte ptr[count]
			ror eax, cl
	}
}
unsigned int Rol(unsigned int data, unsigned int count){
	__asm{
		mov eax, [data]
			mov cl, byte ptr[count]
			rol eax, cl
	}
}

unsigned char _0_7[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
unsigned char _8_F[] = { 8, 9, 10, 11, 12, 13, 14, 15 };

unsigned int data[256] = { 0 };

//在keyfunc1中调用了这个函数
unsigned int * MakeArr(){

	unsigned long long a = *(unsigned long long*)_0_7;
	unsigned long long b = 0xF0E0D0C0B0A0908;
	unsigned long long _0x28 = 0x67452301EFCDAB89;
	unsigned int _0xc = 0x98BADCFE;

	data[0] = ExchangeBit(a >> 32);
	data[1] = ExchangeBit(a & 0xffffffff);

	data[2] = ExchangeBit(b >> 32);
	data[3] = ExchangeBit(b & 0xffffffff);

	for (int i = 4;i<=0x2b;i++)
	{
		unsigned int edx;
		unsigned int a = Ror(data[i - 1],3);
		edx = (_0x28 & 1) ^ (_0xc);

		edx ^= data[i - 4];

		edx ^= Ror(data[i - 1], 3);

		edx ^= data[i - 3];

		edx ^= Ror(data[i - 1], 4);
		edx ^= Ror(data[i - 3], 1);

		data[i] = edx;
		_0x28 >>= 1;
		//unsigned int b = Ror(data[i - 4],)
	}

	return data;
}

unsigned long long  KeyFunc1(unsigned char*pQword){
	unsigned int*pAddr = MakeArr();
	unsigned long long qword = *(unsigned long long*)pQword;

	unsigned int Hidword = ExchangeBit(qword >> 32);
	unsigned int Lodword = ExchangeBit(qword);

	for (int i = 0; i <= 0x2b; i++){
		unsigned int temp = Lodword;

		unsigned int ebx = 0;

		ebx = Rol(Lodword, 1);
		ebx &= Rol(Lodword, 8);
		ebx ^= Rol(Lodword, 2);
		ebx ^= Hidword;

		ebx ^= pAddr[i];

		
		Lodword = ebx;
		Hidword = temp;
	}
	return (((unsigned long long)Lodword) << 32) | Hidword;
}

unsigned long long deKeyFunc1(unsigned char*pQword){
	unsigned int*pAddr = MakeArr();
	unsigned long long qword = *(unsigned long long*)pQword;

	unsigned int Lodword = qword >> 32;
	unsigned int Hidword = qword;

	for (int i = 0x2b; i >= 0; i--){

		unsigned int old_lodword = Hidword;

		unsigned int ebx = 0;

		ebx = Rol(old_lodword, 1);
		ebx &= Rol(old_lodword, 8);
		ebx ^= Rol(old_lodword, 2);
		ebx ^= pAddr[i];


		Hidword = Lodword ^ ebx;
		Lodword = old_lodword;
	}
	Lodword = ExchangeBit(Lodword);
	Hidword = ExchangeBit(Hidword);
	return ((((unsigned long long)Hidword)<<32) | (Lodword));
}

void KeyFunc2(int count,unsigned int*p){
	unsigned int*pArr = (unsigned int*)_0_7;

	unsigned int lodword = p[0];
	unsigned int hidword = p[1];

	unsigned int val = 0x10325476;

	unsigned int A = 0;

	for (int i = 0; i < count; i++)
	{
		lodword += ((((hidword << 4) ^ (hidword >> 5)) + hidword) ^ (A + (pArr)[A & 3]));
		A += val;
		hidword += (((((lodword << 4) ^ (lodword >> 5))) + lodword) ^ (A + (pArr)[((A >> 0xB) & 3)]));
	}
	p[0] = lodword;
	p[1] = hidword;
}

void deKeyFunc2(int count, unsigned int *p){
	unsigned int*pArr = (unsigned int*)_0_7;

	unsigned int lodword = p[0];
	unsigned int hidword = p[1];

	unsigned int val = 0x10325476;
	unsigned int A = 0;

	for (int i = 0; i < count; i++){
		A += val;
	}

	for (int i = 0; i < count; i++){
		hidword -= (((((lodword << 4) ^ (lodword >> 5))) + lodword) ^ (A + (pArr)[((A >> 0xB) & 3)]));
		A -= val;
		lodword -= ((((hidword << 4) ^ (hidword >> 5)) + hidword) ^ (A + (pArr)[A & 3]));
	}

	p[0] = lodword;
	p[1] = hidword;
}
char flag[128] = { 0 };

unsigned char EncryptData[32] = { 0 };


unsigned char TargetData[] =
{
	0x66, 0xC2, 0xF5, 0xFD, 0x86, 0x82, 0x32, 0x7A, 0x04, 0x40,
	0x94, 0xCE, 0xDC, 0x8A, 0xE0, 0x5D, 0x0A, 0xBD, 0xE4, 0xA6,
	0xDC, 0xAD, 0xCA, 0x16, 0x0C, 0x6F, 0xCD, 0x13, 0x36, 0xD9,
	0x75, 0x1A
};

void encrypt(char*flag){

	for (int i = 0; i < 4; i++){
		//step1
		unsigned long long data = KeyFunc1((unsigned char*)flag + i * 8);
		//step2
		KeyFunc2(1 << (i + 1),(unsigned int*)&data);
		//step3
		memcpy(EncryptData + i * 8, &data, sizeof(data));
	}
}
void decrypt(){
	for (int i = 0; i < 4; i++){
		deKeyFunc2(1 << (i + 1), (unsigned int*)(TargetData + i * 8));
		unsigned long long data = deKeyFunc1((TargetData + i * 8));
		*(unsigned long long*)(&flag[i * 8]) = data;
	}

}

int main(){
	decrypt();
	puts(flag);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Suspend.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值