VSCode Hex 편집기로 크랙

해커가 독점 애플리케이션을 우회하여 원하는 작업을 수행하는 방법에 대해 궁금한 적이 있습니까? 라이센스를 요구하지 않는 것과 같습니다.

이 게시물에서는 Linux 또는 macOS에서 간단한 실행 파일을 크랙하는 방법을 볼 것입니다(Windows에서는 테스트되지 않았지만 아마 잘 작동할 것입니다).

설치



VSCode와 그 확장자: Hex Editor이 필요합니다.

다음으로 GCC 또는 Clang과 같은 C 컴파일러가 필요합니다.

엮다



크래킹 프로세스를 배우기 위해 매우 간단한 C 프로그램을 크래킹하는 방법을 살펴보겠습니다. main.c에 다음을 입력합니다.

#include <stdio.h>

int main()
{
  int i = 0;

  if (i)
    printf("OK\n");
  else
    printf("KO\n");
  if (!i)
    printf("i = 0\n");
  return (0);
}

그런 다음 gcc main.c -o a.out 로 컴파일합니다. a.out 실행 파일은 컴파일러에 의해 생성됩니다. 소스 코드가 없는 경우 원하는 작업을 수행하도록 a.out을 직접 수정합니다.

도전 #1



첫 번째 과제는 실행 파일을 인쇄하는 것입니다.

$ ./a.out
OK
i = 0

그러나 지금은 다음과 같이 인쇄됩니다.

$ ./a.out
KO
i = 0

프로그램을 수정하려면 필요에 따라 다시 작성할 수 있도록 CPU에서 실행되는 명령이 무엇인지 알아야 합니다. 다음을 실행하여 실행 파일을 분해합니다.

$ objdump -M intel -j .text --disassemble=main ./a.out # on Linux
$ objdump -d -x86-asm-syntax=intel ./a.out # on macOS

x86_64 CPU가 있는 Linux에는 다음이 있습니다.

a.out:     file format elf64-x86-64


Disassembly of section .text:

0000000000001135 <main>:
    1135:       55                      push   rbp
    1136:       48 89 e5                mov    rbp,rsp
    1139:       48 83 ec 10             sub    rsp,0x10
    113d:       c7 45 fc 00 00 00 00    mov    DWORD PTR [rbp-0x4],0x0
    1144:       83 7d fc 00             cmp    DWORD PTR [rbp-0x4],0x0
    1148:       74 0e                   je     1158 <main+0x23>
    114a:       48 8d 3d b3 0e 00 00    lea    rdi,[rip+0xeb3]        # 2004 <_IO_stdin_used+0x4>
    1151:       e8 da fe ff ff          call   1030 <puts@plt>
    1156:       eb 0c                   jmp    1164 <main+0x2f>
    1158:       48 8d 3d a8 0e 00 00    lea    rdi,[rip+0xea8]        # 2007 <_IO_stdin_used+0x7>
    115f:       e8 cc fe ff ff          call   1030 <puts@plt>
    1164:       83 7d fc 00             cmp    DWORD PTR [rbp-0x4],0x0
    1168:       75 0c                   jne    1176 <main+0x41>
    116a:       48 8d 3d 99 0e 00 00    lea    rdi,[rip+0xe99]        # 200a <_IO_stdin_used+0xa>
    1171:       e8 ba fe ff ff          call   1030 <puts@plt>
    1176:       b8 00 00 00 00          mov    eax,0x0
    117b:       c9                      leave  
    117c:       c3                      ret    

와우 비밀스럽네요. 예 이것은 어셈블러(ASM)입니다. Javascript가 어렵다고 생각한 적이 있다면 지금 당장 머리가 녹을 것 같지만 괜찮습니다. 3가지만 알면 됩니다.
  • 첫 번째 열은 파일에 있는 명령의 시작 주소입니다.
  • 세 번째 열은 ASM 명령어 이름이고 네 번째 열은 인수입니다.
  • 두 번째 열은 명령의 해당 바이트 코드와 해당 인수(있는 경우)입니다.

  • 다음은 알아두면 유용한 3가지 지침입니다.
  • jmp 명령어는 eb로 인코딩되며 기본적으로 메모리의 주소로 점프합니다.
  • je 명령(74)은 같으면 점프하며 C의 if (...)와 같습니다.
  • jne 명령(75)은 같지 않으면 점프하며 C의 if (!...)와 같습니다.

  • Always remember that numbers can vary from one CPU to another. I'm on an x86_64 and you're probably on an x86 CPU as well but there are other architectures like ARMv6. Each architecture can have a more or less different instruction set.



    해당 지침은 CPU 모델에 따라 다르므로 컴퓨터에서 동일한 번호로 인코딩되지 않을 수 있습니다.

    뭔지 맞춰봐. 이 문제를 해결하려면 주소 1148에서 첫 번째 je 명령을 다음 중 하나로 수정하면 됩니다.
  • jmp 명령
  • jne 명령

  • Hex Editor 확장 프로그램으로 a.out을 열고 주소 1148에서 74 0e를 검색하십시오. 제가 제시하는 모든 숫자가 다를 수 있으므로 출력에서 ​​가져오십시오.



    이제 명령어 je를 jmp로 변경합니다.



    저장 및 실행:

    $ ./a.out
    OK
    i = 0
    

    결론



    잘하셨습니다. 첫 번째 크래킹 챌린지를 해결하셨습니다!
    마음에 든다면 root-me.org과 같은 플랫폼에서 더 어려운 도전에 도전할 수 있습니다.

    또는 다음 과제를 직접 해결해 볼 수 있습니다.

    $ ./a.out
    OK
    

    https://www.felixcloutier.com/x86/

    다른 게시물에서는 다음과 같이 크래킹 프로세스를 쉽게 하는 상위 수준 도구를 다룰 것입니다.
  • Cutter
  • Radare

  • Ghidra (커터에 통합됨)

  • 행복한 크래킹 🛠

    좋은 웹페이지 즐겨찾기