반응형
Hex Encrypt Data
이번 CTF 대회에 출제된 문제를 바탕으로 암호화 부분을 변형하여 만들어봤다
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 암호화 함수: 주어진 데이터 배열을 암호화하여 반환
unsigned long* encryption(unsigned long data[], unsigned long size)
{
unsigned int temp1;
unsigned int temp2;
unsigned int temp3;
unsigned int index;
// 데이터 배열의 각 요소에 대해 암호화 수행
for (index = 0; index < size; index++)
{
temp1 = data[index];
temp2 = temp1 + 0x1A;
temp1 = temp1 + 0x5;
temp2 = temp1 * temp2;
temp3 = temp2 >> 16;
temp1 = temp3 ^ temp2;
data[index] = temp1;
}
return data;
}
// 입력 데이터를 암호화 함수에 맞게 준비하는 함수
unsigned long* _encryption(void* data, unsigned long size)
{
unsigned long* data_chunk = NULL;
unsigned long* result;
int i;
if (size & 1) size++; // 데이터 크기가 홀수이면 짝수로 맞추기 위해 1을 더함
data_chunk = (unsigned long*)malloc(size * sizeof(unsigned long)); // 메모리 할당
if (!data_chunk) return NULL; // 메모리 할당 실패 시 NULL 반환
memset(data_chunk, 0, size * sizeof(unsigned long)); // 할당된 메모리를 0으로 초기화
// 입력 데이터를 2바이트씩 처리하여 data_chunk 배열에 저장
for (i = 0; i < size / 2; i++) data_chunk[i] = ((unsigned short*)data)[i];
result = encryption(data_chunk, size / 2); // 암호화 함수 호출
return result;
}
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Usage: %s <text to encrypt>\n", argv[0]);
return 1; // 인자가 제공되지 않았을 때 프로그램 종료
}
const char* input = argv[1];
unsigned long size = strlen(input); // 입력 문자열의 길이를 사용
unsigned long* encrypted_data = _encryption((void*)input, size); // 입력 데이터를 암호화
// 암호화된 데이터를 16진수 형식으로 출력
printf("Encrypted data in hexadecimal format: ");
for (unsigned long i = 0; i < (size + 1) / 2; i++) { // 암호화 함수의 로직에 따라 루프 조건 조정
printf("%lx", encrypted_data[i]);
}
printf("\n");
free(encrypted_data); // 할당된 메모리 해제
return 0;
}
코드 블럭은 C++인데 C언어로 만들었다 ( c언어 항목이 없다... )
exe 실행 파일로 컴파일 후 실행시키면 된다
더보기
↑ Hex Encrypt Data 실행 파일 ↑
gcc 작업이 귀찮으면 위에 파일을 다운받으면 된다
실행 파일이 의심되면 코드를 gcc 컴파일 후 실행되는 결과값을 확인해 보자
리눅스 버전에서는 gcc가 기본적으로 설치되어 있어
gcc -o output_file source_file.c 명령어로 컴파일을 진행하면 된다
윈도우에서는 따로 MinGW 도구를 설치해서 gcc를 사용하면 된다 명령어는 위에랑 동일하다
exe 파일을 실행할 때 인자 값도 같이 전달해 주면 뒤에 전달한 인자 값이 16진수로 암호화되어 출력되는 걸 알 수 있다
암호화된 문자 : 307bf941333a751c12d4d2902901fe813334db20341f5c012514c950283f582b13ee69aa283f582b34f611f48c2
이제 암호화된 문자를 가지고 원본 데이터를 복구시켜보세요
[ Hex Encrypt Data Write-Up ]
반응형