CTF/Customized CTF

[Reversing] Hex Encrypt Data - CTF

2024. 7. 21. 01:44

QUOTE THE DAY

Self-Talk
반응형

 

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 실행 파일로 컴파일 후 실행시키면 된다

 

더보기
hexencrypt.exe
0.04MB

↑  Hex Encrypt Data 실행 파일 ↑

 

gcc 작업이 귀찮으면 위에 파일을 다운받으면 된다

실행 파일이 의심되면 코드를 gcc 컴파일 후 실행되는 결과값을 확인해 보자

 

리눅스 버전에서는 gcc가 기본적으로 설치되어 있어

gcc -o output_file source_file.c 명령어로 컴파일을 진행하면 된다

 

윈도우에서는 따로 MinGW 도구를 설치해서  gcc를 사용하면 된다 명령어는 위에랑 동일하다

 

 

exe 파일을 실행할 때 인자 값도 같이 전달해 주면 뒤에 전달한 인자 값이 16진수로 암호화되어 출력되는 걸 알 수 있다

 

암호화된 문자 : 307bf941333a751c12d4d2902901fe813334db20341f5c012514c950283f582b13ee69aa283f582b34f611f48c2

 

이제 암호화된 문자를 가지고 원본 데이터를 복구시켜보세요

 

[ Hex Encrypt Data Write-Up ]

더보기

 

 

[Write-Up] Hex Encrypt Data

Hex Encrypt Data 코드에서 나와있듯이 _encryption  함수는 실제 encryption 암호화하는 함수를 호출하기 위해 입력 데이터를 각각 2byte씩 처리하여 암호화하는 형식이다사진에서 코드를 실행할 때 암

mu-sa.tistory.com

 

 

 

반응형
저작자표시 (새창열림)
'CTF/Customized CTF' 카테고리의 다른 글
  • [Forensics] KakaoTalk Decrypt - CTF
MUSA
MUSA
Nine Point Eight

최근 댓글

최근 글

인기 글

  • MUSA
    무사
    Nine Point Eight
    • 홈

    • 방명록

    • 분류 전체보기 (124)
      • Minecraft (29)
        • Server Development (16)
        • ResourcePack (7)
        • Plugin (5)
        • Java Plugin (1)
      • Tistory (15)
        • 티스토리 수익 (3)
        • 티스토리 검색 유입 (3)
        • 티스토리 꾸미기 (9)
      • Windows (2)
      • Kali Linux (42)
        • Linux (24)
        • Bandit (18)
        • Tool (0)
      • Web Study (26)
        • Theory (14)
        • Training (12)
      • CTF (5)
        • HackTheon (1)
        • Customized CTF (2)
        • CTF Write-Up (2)
      • Forensics (1)
      • System (1)
      • Cryptography (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
MUSA
[Reversing] Hex Encrypt Data - CTF
상단으로

티스토리툴바