본문 바로가기
해킹&보안/악성코드 및 치트

Reverse Engineering 6

※문제 ※


Main 함수 내부 코드

int __fastcall main(int argc, const char **argv, const char **envp)
{
  char v4[256]; // [rsp+20h] [rbp-118h] BYREF

  memset(v4, 0, sizeof(v4));
  sub_1400011C0("Input : ", argv, envp);
  sub_140001220("%256s", v4);
  if ( (unsigned int)sub_140001000(v4) )
    puts("Correct");
  else
    puts("Wrong");
  return 0;
}

프로그램은 사용자로부터 입력을 받아들이고, 해당 입력을 조건을 따라 판별하여 "Correct" 또는 :"Wrong"을 출력합니다.

프로그램의 실행은 main함수를 통해 시작되고, 입력은 256글자까지 저장할 수 있는 배열을 통해 처리하게 되어있습니다.

문자열 판별을 위해 sub_140001000로 이동해보겠습니다.

 

__int64 __fastcall sub_140001000(__int64 a1)
{
  int i; // [rsp+0h] [rbp-18h]

  for ( i = 0; (unsigned __int64)i < 0x18; ++i )
  {
    if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_140003000[i] )
      return 0i64;
  }
  return 1i64;
}

if문을 확인해보면 a1배열의 i번쨰와 i+1번쨰 요소를 더한 값아 byte_140003000 배열의 i번쨰 요소와 같은지 같지않은지 확인합니다.

 

 

byte_140003000 배열을 확인해봅시다

.data:0000000140003000                 ;org 140003000h
.data:0000000140003000 ; unsigned __int8 byte_140003000[32]
.data:0000000140003000 byte_140003000  db 0ADh, 0D8h, 2 dup(0CBh), 9Dh, 97h, 0CBh, 0C4h, 92h
.data:0000000140003000                                         ; DATA XREF: sub_140001000+48↑o
.data:0000000140003009                 db 0A1h, 0D2h, 0D7h, 0D2h, 0D6h, 0A8h, 0A5h, 0DCh, 0C7h
.data:0000000140003012                 db 0ADh, 0A3h, 0A1h, 98h, 4Ch, 9 dup(0)
.data:0000000140003020 qword_140003020 dq 0FFFFD466D2205DCDh   ; DATA XREF: __report_gsfailure+B4↑r

arr = [0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00]

위 값들로 계산을 해야하는데 저는 c언어로 구현해보겠습니다.

 

C언어 구현

#include <stdio.h>

int main() {
    int arr[24] = {0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1, 0xD2, 0xD7, 0xD2, 0xD6, 0xA8,
                   0xA5, 0xDC, 0xC7, 0xAD, 0xA3, 0xA1, 0x98, 0x4C, 0x00};
    int a[24];

    a[22] = 0x4C;

    for (int i = 21; i >= 0; i--)
        a[i] = arr[i] - a[i + 1];

    for (int i = 0; i < 23; i++)
        printf("%c", a[i]);
    printf("\n");

    return 0;
}

 

 

 

코드를 구현해봤으니 실행해봅시다

실행결과

All_l1fe_3nds_w1th_NULL로 플래그가 나오게 됩니다.

'해킹&보안 > 악성코드 및 치트' 카테고리의 다른 글

악성코드 분석 1  (3) 2024.05.12
Reverse Engineering 7  (0) 2024.05.11
Reverse Engineering 5  (1) 2024.05.01
Reverse Engineering 4  (1) 2024.03.27
Reverse Engineering 3  (2) 2024.03.25