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가지만 알면 됩니다.
크래킹 프로세스를 배우기 위해 매우 간단한 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가지만 알면 됩니다.
$ ./a.out
OK
i = 0
$ ./a.out
KO
i = 0
$ objdump -M intel -j .text --disassemble=main ./a.out # on Linux
$ objdump -d -x86-asm-syntax=intel ./a.out # on macOS
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
다음은 알아두면 유용한 3가지 지침입니다.
if (...)
와 같습니다. 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 명령을 다음 중 하나로 수정하면 됩니다.
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/
다른 게시물에서는 다음과 같이 크래킹 프로세스를 쉽게 하는 상위 수준 도구를 다룰 것입니다.
$ ./a.out
OK
Ghidra (커터에 통합됨)
행복한 크래킹 🛠
Reference
이 문제에 관하여(VSCode Hex 편집기로 크랙), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ctison/crack-executables-with-vscode-hex-editor-5gdf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)