REPO DEEP DIVE · 2026-07-25 · REVERSE-ENGINEERING · 리버싱 커리큘럼

mytechnotalent/Reverse-Engineering 딥다이브
6년 반 동안 매일 한 강씩 쌓아 550레슨이 된 무료 리버스 엔지니어링 커리큘럼

Reverse Engineering은 코드 저장소가 아니라 교육과정이다. 2020년 2월 14일 첫 강의를 올린 뒤 오늘(2026-07-25)까지 한 번도 끊기지 않고 "Today's Tutorial"을 갱신해 왔고, 지금 28개 코스 · 550개 레슨이 쌓였다. x86으로 시작해 ARM-32 → x64 → ARM-64 → Raspberry Pi Pico → Windows → Go → Rust → 8비트 AVR → RISC-V → WebAssembly까지, 아키텍처 6종을 어셈블리 레벨에서 훑는다.

전부 무료다. 430페이지짜리 PDF 책 Reversing for Everyone이 저장소에 그대로 들어 있고, 라이선스는 Apache-2.0이다. 별 14,000개 · 포크 1,441개가 그 값어치를 증명한다.

다만 구조가 특이하다. 이 저장소는 본체가 아니라 '목차'다 — README 한 파일(2,978줄 · 178KB)이 583개 링크로 48개의 위성 저장소를 가리킨다. 그 구조가 이 프로젝트의 최대 강점이자 가장 큰 불편함이다. §4에서 그 얘기를 한다.

(저장소 mytechnotalent/Reverse-Engineering · 저자 Kevin Thomas · 언어 Assembly · 시작 2020-02-14 · 라이선스 Apache-2.0 · ★ 13,998 · shallow clone 소스 직접 분석)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 별 14,000개를 받았는가
  3. 커리큘럼 전체 지도 — 28개 코스 550레슨
  4. 구조 심화 분석 — '허브 저장소'라는 형태
  5. 디렉토리 구조 해부
  6. 학습 포인트 — 교수법 3박자와 솔직한 한계
  7. 준비물 — 소프트웨어와 하드웨어
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

"컴파일된 프로그램을 거꾸로 읽는 법"을 6종 아키텍처로 가르치는 무료 학교

리버스 엔지니어링은 완성된 프로그램에서 원래 설계를 되짚어 내는 일이다. 우리가 평소 하는 건 순방향이다 — C나 Rust로 소스를 쓰면 컴파일러가 기계어로 번역해 준다. 리버싱은 그 반대다. 기계어 덩어리만 손에 쥔 채 "이게 무슨 일을 하는가"를 알아내야 한다. 소스도, 주석도, 변수 이름도 없다.

핵심 비유

"완성된 케이크를 앞에 두고 레시피를 알아내는 것" — 그런데 밀가루는 이미 빵이 됐다

컴파일은 되돌릴 수 없는 요리에 가깝다. 계란과 밀가루를 섞어 구우면 다시 계란으로 못 돌아간다. 컴파일러도 마찬가지다. 변수 이름, 주석, 코드 구조 대부분을 버리고 기계가 실행할 숫자 덩어리만 남긴다.

그럼에도 알아낼 수 있는 이유는, 요리에 흔적이 남기 때문이다. 반죽 결에서 밀가루의 종류가 보이고, 굽는 방식에서 오븐 온도가 짐작된다. 기계어에도 똑같다 — 함수 호출 규약, 스택 정리 방식, 문자열 상수, API 호출이 그대로 남는다. 이 강의가 550개 레슨 내내 훈련시키는 게 바로 그 흔적을 읽는 눈이다.

이 저장소가 다루는 범위는 상당히 넓다. 데스크톱 CPU(x86 · x64), 스마트폰과 라즈베리파이의 CPU(ARM-32 · ARM-64), 아두이노의 8비트 마이크로컨트롤러(AVR ATmega328P), 그리고 요즘 뜨는 개방형 아키텍처(RISC-V)까지. 여기에 WebAssembly를 마이크로컨트롤러에 올려 리버싱하는 최신 코스까지 붙었다.

용어 풀이
정적 분석 vs 동적 분석 (static / dynamic analysis)
리버싱의 두 축이다. 정적 분석은 프로그램을 실행하지 않고 디스어셈블러(IDA·Ghidra)로 코드를 읽는 것 — 책을 펼쳐 읽는 것과 같다. 동적 분석은 디버거(GDB·x64dbg)로 실제로 돌려 가며 레지스터와 메모리가 어떻게 변하는지 관찰하는 것 — 요리하는 걸 옆에서 지켜보는 것과 같다. 악성코드는 실행하면 위험하니 정적으로 먼저 보고, 난독화가 심하면 동적으로 풀어 본다. 이 강의는 레슨 2에서 바로 이 구분부터 가르친다.

저자는 Kevin Thomas(mytechnotalent)로, 해커 커뮤니티 DC540(DEF CON 그룹)을 운영하고 Ouroboros라는 하드웨어 해킹 배지도 만들어 판다. 저장소에는 그 배지의 암호 엔진 설명 PDF와 회로도(Fritzing .fzz)까지 들어 있다.

2왜 별 14,000개를 받았는가

숫자로 확인되는 이유 네 가지

① 2,354일 연속 — 끊기지 않았다는 사실 자체

2020년 2월 14일에 시작해 오늘까지 6년 5개월. README 맨 위에는 언제나 「Today's Tutorial [날짜]」가 붙어 있고, 오늘 자는 Lesson 255: Hacking Rust Course (Chapter 10: Functions)다. 클론해서 확인해 보면 레슨 번호가 1번부터 550번까지 하나도 빠짐없이 이어진다 — 중간에 포기하고 건너뛴 흔적이 없다. 무료 교육 자료가 흔한 시대에 희소한 건 콘텐츠가 아니라 지속성이고, 이 저장소의 별은 대부분 거기에 붙은 표다.

② 아키텍처 6종을 한 사람이 같은 방식으로 가르친다

x86 책 따로, ARM 책 따로 사서 보면 설명 스타일과 난이도가 제각각이라 머릿속에서 연결이 안 된다. 이 커리큘럼은 6종을 전부 같은 사람이, 같은 순서로 가르친다. 그래서 "x86에서 배운 스택 개념이 ARM에서는 어떻게 달라지는가"가 자연스럽게 비교된다. 실제로 각 코스가 거의 같은 뼈대를 반복한다 — 숫자 체계 → 레지스터 → 스택 → 명령어 → 실습.

③ 완전 무료 + Apache-2.0

430페이지 PDF 책 Reversing for Everyone이 저장소 안에 통째로 들어 있다(25MB). 위성 저장소마다 별도 PDF 책이 또 있다 — Hacking_Windows.pdf, Hacking Rust.pdf, hacking-bits.pdf, Hacking-RISC-V.pdf. 라이선스가 Apache-2.0이라 교육용 재배포·번역·2차 저작이 명시적으로 허용된다. (앞서 살펴본 라이선스 없는 저장소들과 대비되는 지점이다.)

④ 소프트웨어에서 멈추지 않는다

후반부 코스는 대부분 실물 하드웨어를 쓴다. Raspberry Pi Pico/RP2350, ESP32-C3(RISC-V), ATmega328P(아두이노), micro:bit. 저장소에 Fritzing 회로도 3종(static RE schematic·dynamic RE schematic·oled and button schematic)이 들어 있고, Assembler 코스 24강은 LCD·시프트 레지스터·스테퍼 모터·릴레이·적외선 리모컨을 전부 순수 AVR 어셈블리로 제어한다. 화면 속 개념이 아니라 손에 잡히는 결과물로 끝난다는 게 완주율을 크게 높인다.

비유

보통의 온라인 강의가 요리 동영상이라면, 이 커리큘럼은 6년째 매일 문 여는 요리 학원에 가깝다. 진도가 정해져 있고, 오늘 배울 게 칠판에 적혀 있고, 초급반(x86)부터 고급반(RISC-V·Wasm)까지 반이 나뉘어 있다. 그리고 수강료가 없다.

3커리큘럼 전체 지도 — 28개 코스 550레슨

클론해서 직접 센 숫자다. 어디부터 들어갈지 고르는 표
코스레슨번호대무엇을 배우나
x86 Course401–40맬웨어 분석 개론 → 2진수·16진수 → 레지스터·플래그·스택·힙 → Linux/vim → ASM 6종 실습(작성·디버깅·해킹 3연타)
ARM-32 Course 12541–65ARM 레지스터·CPSR·링크 레지스터·부트 절차·폰노이만 구조·명령어 파이프라인
ARM-32 Course 24966–114ARM 심화 — 가장 긴 코스
ARM-32 Project6115–120Hello World·int·float·double·char·char 포인터 해킹 실전 6종
x64 Course43121–163트랜지스터·논리 게이트부터 다시 쌓아 올리는 64비트 과정
ARM-64 Course20164–18364비트 ARM(AArch64)
Pico Hacking20184–203Raspberry Pi Pico 개발환경 → Hello World → 디버깅 → 해킹
Hacking Windows30204–233순수 어셈블리 Win32 MessageBox → x86/x64 디버깅·해킹
Go Hacking12234–245Go 바이너리 리버싱(런타임이 큰 언어의 특징)
Hacking Rust15246–260Rust 바이너리 리버싱 — 오늘의 강의가 여기(Ch.10 함수)
Embedded Rust ×211261–271Embassy 프레임워크로 Pico·micro:bit 임베디드 Rust
Embedded Assembler11272–282임베디드 어셈블리 입문
Embedded Hacking40283–322임베디드 해킹 대형 코스
Hacking Bits10323–332옴의 법칙·전자공학 기초 → 2진수 → ATmega328P 구조 → 툴체인
Hacking RISC-V9333–341ESP32-C3로 배우는 개방형 ISA. PlatformIO 환경
RP2350 드라이버 ×6180342–521UART·Blink·Button 드라이버를 ARM판과 RISC-V판 각각 30강씩. 전체의 3분의 1
Wasm ×55522–526WebAssembly 컴포넌트를 RP2350 베어메탈에 올려 UART·LED·버튼·서보 제어 + 각각의 RE 튜토리얼
Assembler Course24527–550순수 AVR 어셈블리로 Serial·LCD·온도계·시프트레지스터·7세그먼트·DC/스테퍼 모터·릴레이·IR 리모컨
읽는 법
RP2350 드라이버 6코스(180강)가 전체의 33%를 차지한다

표를 보면 무게중심이 어디로 옮겨갔는지 보인다. 초창기(2020~)는 x86·ARM 어셈블리 기초였는데, 최근 몇 년은 RP2350 마이크로컨트롤러 드라이버를 ARM판·RISC-V판으로 나란히 짜는 데 180강을 썼다. 같은 하드웨어를 두 아키텍처로 반복하는 구성이라, ISA 비교 학습에는 최적이지만 리버싱 자체를 배우려는 사람에겐 분량이 과하게 느껴질 수 있다. 목적에 맞게 골라 듣는 게 낫다.

경로 추천을 하나 하자면 이렇다. 리버싱이 목적이면 x86(1–40) → x64(121–163) → Hacking Windows(204–233) → Go/Rust(234–260)까지 약 145강이면 데스크톱 바이너리 분석의 기본기가 선다. 임베디드가 목적이면 Hacking Bits(323–332)로 전자공학 기초를 깔고 Assembler Course(527–550)로 바로 넘어가는 게 빠르다.

4구조 심화 분석 — '허브 저장소'라는 형태

이 저장소를 클론해도 강의는 거의 들어 있지 않다

이게 가장 먼저 이해해야 할 사실이다. 저장소 이름은 Reverse-Engineering이지만, 내용물의 대부분은 여기 없다. README를 파싱해 보면 링크가 583개인데, 그 분포가 구조를 그대로 드러낸다.

README.md (2,978줄 · 178KB) — 실질적으로 이 저장소의 전부 │ ├─▶ github.com/mytechnotalent/* 380개 링크 → 48개 위성 저장소 │ Hacking-Windows · Hacking-Rust · Hacking-RISC-V · Hacking-Bits │ Assembler · Embedded-Hacking · Go-Hacking · Wasm │ RP2350_UART_Driver(_RISCV) · RP2350_Blink_Driver(_RISCV) · ... │ dc540-0x00001 ~ 0x00009 (CTF 9종) · ouroboros · turbo-scanner ... │ ├─▶ 0xinfection.github.io/reversing 199개 링크 → 온라인 e-book 한 권 │ (x86·ARM·x64·ARM-64·Pico 코스 레슨이 전부 여기 하나로 감) │ └─▶ 나머지 4개 YouTube 프로모 · Discord · Tindie(배지 판매) · Apache 라이선스 로컬에 실제로 들어 있는 것 ├── reversing-for-everyone.pdf 25MB · 약 430페이지 (책 본체) ├── 0x0001 ~ 0x0013 Visual Studio 예제 7종 (아래 §5) ├── 회로도 3종 (.fzz + .png) Fritzing 원본까지 포함 └── Ouroboros 배지 자료 수식 이미지 11종 + How_It_Works.pdf

이 형태의 장점

한 곳만 보면 전체 지도가 보인다. 550강이 번호순으로 한 페이지에 늘어서 있으니, "지금 내가 어디쯤 왔고 다음은 뭔가"가 스크롤 한 번에 파악된다. 저자 입장에서도 코스마다 저장소를 나눠 두면 각 코스를 독립적으로 관리·배포할 수 있다. Hacking-Rust만 필요한 사람은 그 저장소만 클론하면 된다.

비유

이 저장소는 도서관 카드 목록함이다. 목록함 자체에는 책이 없다. 대신 "3층 A열 12번에 이 책이 있다"는 카드가 550장 꽂혀 있다. 목록함이 있어야 도서관을 쓸 수 있다는 점에서 필수적이지만, 목록함을 통째로 집에 가져와도 책은 한 권도 안 딸려 온다.

이 형태의 대가 — 네 가지 불편함

불편 1
x86·ARM·x64·Pico 코스 199강이 전부 같은 링크 하나로 간다

초기 코스(레슨 1~203)의 링크를 세어 보면 199개가 전부 0xinfection.github.io/reversing 한 주소다. 즉 "레슨 27을 보려면" 그 e-book을 열고 해당 챕터를 직접 찾아가야 한다. 레슨 단위 딥링크가 아니다. 550강 중 200강 가까이가 이런 상태라, 초심자가 처음 부딪히는 마찰이 바로 여기다.

반면 후기 코스(Hacking Windows 이후)는 각 위성 저장소의 PDF나 lessons/NNN/lesson.md로 정확히 연결된다 — 시간이 지나며 저자도 이 문제를 인지하고 방식을 바꾼 흔적이다.

불편 2
외부 호스팅 의존 — 링크 하나가 죽으면 200강이 날아간다

0xinfection.github.io저자 본인의 도메인이 아니다(다른 사람의 GitHub Pages에 호스팅된 e-book이다). 그 페이지가 내려가면 초기 200강의 학습 경로가 통째로 끊긴다. 다행히 같은 책의 PDF가 저장소 안에 reversing-for-everyone.pdf로 들어 있으니 그걸 받아 두는 게 안전하다 — 이 문서를 읽는 사람이 지금 바로 해 둘 만한 일이다.

불편 3
178KB 단일 README — 렌더링도 검색도 불편하다

2,978줄짜리 마크다운 한 파일이다. GitHub 웹에서 열면 스크롤이 길어 브라우저가 버벅이고, 모바일에서는 특히 심하다. 목차가 앵커 링크로 붙어 있긴 하지만, 레슨 번호로 점프하는 수단은 없다. "레슨 384가 뭐였지"를 찾으려면 Ctrl+F가 유일한 방법이다. 코스별 파일 분리나 정적 사이트 생성(예: GitHub Pages + mkdocs)이면 크게 나아질 지점이다.

불편 4
저장소 용량 423MB — 대부분이 빌드 산출물이다

클론해서 du를 재 보면 작업 트리만 423MB다. 그런데 .gitignore단 11바이트다. 그 결과 Visual Studio가 뱉은 중간 산출물이 전부 커밋돼 있다 — .obj · .pdb · .ilk · vc142.idb · *.tlog/*(빌드 로그) · CppClean.log. §5의 파일 목록을 보면 실제 소스(main.asm · main.c)보다 빌드 찌꺼기가 10배 이상 많다. 교육 저장소에서 흔히 보는 실수지만, 학습자가 클론할 때 그대로 비용이 된다.

흥미로운 디테일 — .gitattributes 두 줄

*.asm linguist-detectable=true
*.c   linguist-detectable=false

GitHub 저장소 페이지의 언어 비율 막대를 조작하는 설정이다. .asm은 세고, .c는 세지 말라는 뜻. 그래서 이 저장소는 GitHub에 "Assembly"로 표시된다 — 실제로는 C 코드가 더 많은데도. 기술적으로 정당한 기능이고 "이 저장소의 정체성은 어셈블리다"라는 저자의 선언으로 읽히지만, 저장소 언어 표시는 언제나 사실이 아닐 수 있다는 걸 보여 주는 좋은 사례이기도 하다.

5디렉토리 구조 해부

로컬에 실제로 들어 있는 것들
Reverse-Engineering/ ├── README.md 2,978줄 · 178KB ★ 사실상 이 저장소의 전부 ├── reversing-for-everyone.pdf 25MB · 약 430p ★ 책 본체 (오프라인 백업용) ├── LICENSE Apache-2.0 │ ├── 0x0001-hello_world-x86/ MASM 32비트 MessageBox — main.asm 21줄 ├── 0x0001-hello_world-x64/ 같은 프로그램 64비트판 ├── 0x0006-directories/ C — 디렉토리 생성/삭제 Win32 API ├── 0x0007-copyfile/ C — CopyFile ├── 0x0010-movefile/ C — MoveFile ├── 0x0011-createfile/ C — CreateFile ├── 0x0012-writefile/ C — WriteFile ├── 0x0013-readfile/ C — ReadFile │ 각 폴더: .sln/.vcxproj + main.asm|main.c + Debug/ x64/Debug/ (빌드 산출물 전량) │ ├── "0x0001-hello_world-x86 Debug"/ ← 별도 폴더에 컴파일된 .exe + IDA 데이터베이스 │ *.exe 분석 대상 바이너리 │ *.i64 IDA Pro 64비트 데이터베이스 (분석 결과가 저장된 파일) │ *.id0/.id1/.id2/.nam/.til ← 0x0006-x64만 압축 안 된 상태로 들어 있음 │ ├── static RE schematic.fzz/.png Fritzing 회로도 — 정적 분석 실습 회로 ├── dynamic RE schematic.fzz/.png 동적 분석 실습 회로 ├── oled and button schematic.* OLED + 버튼 회로 ├── badges/ouroboros-badge/ 배지 암호 엔진 수식 이미지 11종 │ eq1_hclk · eq2_baud · eq3_arx · eq4_mac · eq5_led · eq6_lfsr │ eq7_roulette · eq8_keyschedule · eq9_davies · eq10_ctr · eq11_purge ├── Ouroboros_How_It_Works.pdf 배지 암호 엔진 설계 문서 └── .gitattributes 2줄 — 언어 통계 조작 (§4)

로컬 예제 코드 — 가장 먼저 열어 볼 21줄

이 저장소에 실제로 들어 있는 소스 중 가장 상징적인 파일이 0x0001-hello_world-x86/main.asm이다. 순수 MASM 어셈블리로 윈도우 메시지 박스를 띄운다.

.686
.model flat, stdcall
.stack 4096

extrn ExitProcess@4: proc          ;1 param  1x4
extrn MessageBoxA@16: proc         ;4 params 4x4

.data
  msg_txt     db "Hello World", 0
  msg_caption db "Hello World App", 0

.code
  main:
    push 0                         ;UINT uType
    lea  eax, msg_caption          ;LPCSTR lpCaption
    push eax
    lea  eax, msg_txt              ;LPCSTR lpText
    push eax
    push 0                         ;HWND hWnd
    call MessageBoxA@16
    push 0
    call ExitProcess@4
  end main
용어 풀이
호출 규약과 @16의 의미 (stdcall name decoration)
MessageBoxA@16의 숫자 16은 "인자들이 스택에서 차지하는 총 바이트 수"다. 인자 4개 × 4바이트 = 16. 이게 이름에 붙는 이유는 stdcall 규약에서 함수가 스스로 스택을 정리하기 때문이다 — 몇 바이트를 치울지 알아야 하니 이름에 박아 둔다. 리버싱에서 이게 중요한 이유: 디스어셈블한 코드에서 @숫자나 함수 끝의 ret 16을 보면 인자가 몇 개였는지 역산할 수 있다. 심볼이 지워진 바이너리에서도 함수 시그니처를 복원하는 첫 단서가 된다.

또 하나 눈여겨볼 건 x86판과 x64판이 나란히 있다는 점이다. 같은 프로그램을 두 아키텍처로 짜 놓고 디스어셈블 결과를 비교하면, 32비트의 push-기반 인자 전달이 64비트에서 레지스터(RCX·RDX·R8·R9) 기반으로 바뀌는 게 눈으로 보인다. 이 커리큘럼 전체를 관통하는 학습 방식이 여기 압축돼 있다.

발견한 문제
폴더 번호와 파일 번호가 어긋나 있다

0x0007-copyfile/ 폴더 안의 파일들은 0x000b-copyfile.sln · 0x000b-copyfile.vcxproj · 0x000b-copyfile.exe다. 폴더는 7번인데 내용물은 11번(0x000b)이다. 예제를 재배치하면서 프로젝트 파일명을 안 바꾼 흔적으로 보인다.

또 번호가 0x0001 → 0x0006 → 0x0007 → 0x0010 → 0x0011 → 0x0012 → 0x0013으로 건너뛴다. 0x0002~0x0005, 0x0008~0x000f가 통째로 비어 있다. 강의에서는 그 번호를 언급하는데 저장소에는 없는 상태라, "내가 뭘 놓쳤나" 하고 헤매기 쉽다. 없는 게 정상이라는 걸 알고 넘어가면 된다.

주의
IDA 데이터베이스(.i64)를 열려면 IDA Pro가 필요하다

저장소에 커밋된 .i64 파일 13개는 IDA Pro가 분석 결과를 저장한 데이터베이스다. 무료판 IDA Free는 버전에 따라 이 파일을 못 열거나 기능이 제한된다. 학습자 입장에서 현실적인 대안은 무료 오픈소스 Ghidra로 같은 .exe를 직접 열어 분석하는 것이다 — 저자도 Ghidra 플러그인(G-AVR·G-Pulley)을 따로 만들어 배포하고 있으니 방향이 어긋나지도 않는다.

6학습 포인트 — 교수법 3박자와 솔직한 한계

550강을 관통하는 하나의 패턴

Program → Debug → Hack, 이 세 박자가 전부다

x86 코스의 레슨 제목을 보면 규칙이 바로 보인다.

Lesson 22: ASM Program  1 [Moving Immediate Data]
Lesson 23: ASM Debugging 1 [Moving Immediate Data]
Lesson 24: ASM Hacking  1 [Moving Immediate Data]

Lesson 25: ASM Program  2 [Moving Data Between Registers]
Lesson 26: ASM Debugging 2 [Moving Data Between Registers]
Lesson 27: ASM Hacking  2 [Moving Data Between Registers]
   ... 6세트 반복 (레슨 22~39)

같은 주제를 세 번, 다른 관점으로 돈다. 이게 이 커리큘럼의 핵심 교수법이고, Hacking Windows·Pico·Rust 코스에서도 그대로 반복된다.

왜 세 박자인가

"직접 지어 보고 → 도면을 들여다보고 → 벽을 부숴 본다"

Program(짓기): 먼저 자기 손으로 어셈블리를 짜서 돌린다. 남의 코드를 읽기 전에 "이 명령어가 무슨 일을 하는지"를 몸으로 안다.

Debug(들여다보기): 그 프로그램을 디버거에 걸고 한 줄씩 실행하며 레지스터·메모리·스택이 어떻게 변하는지 관찰한다. 내가 짠 코드니까 정답을 이미 아는 상태로 관찰 훈련을 한다 — 이게 결정적이다. 모르는 바이너리부터 시작하면 관찰과 추측이 뒤섞여 실력이 안 는다.

Hack(부수기): 마지막으로 그 바이너리의 메모리나 명령어를 직접 고쳐 동작을 바꾼다. 조건 분기를 뒤집거나 값을 덮어쓴다. "읽을 줄 안다"에서 "바꿀 줄 안다"로 넘어가는 단계이자, 리버싱이 실제로 쓰이는 방식(패치·크랙·취약점 익스플로잇)의 축소판이다.

교육학적으로 보면 "자기가 만든 것을 분석 대상으로 삼는다"는 게 이 설계의 요체다. 학습자는 정답(소스 코드)을 손에 쥔 채 문제(기계어)를 푼다. 답을 아니까 디스어셈블 결과와 원본 소스를 1:1로 대응시키며 "컴파일러가 이걸 이렇게 바꾸는구나"를 익힐 수 있다. 이 대응 감각이 쌓이면, 나중에 소스 없는 바이너리를 봐도 "이건 for 루프였겠다"가 보이기 시작한다.

같은 뼈대를 아키텍처마다 반복한다

코스별 초반 레슨 제목을 나란히 놓으면 반복 구조가 드러난다.

단계x86 CourseARM-32 Course 1x64 CourseHacking RISC-V
동기Goals · Techniques · 맬웨어 종류The Meaning Of LifeThe Cyber RevolutionWhy RISC-V
수의 표현2진수 · 16진수수 체계 · 2진 덧셈/뺄셈트랜지스터 · 논리게이트 · 수 체계2진수 · 16진수
하드웨어트랜지스터와 메모리 · 바이트/워드워드 길이 · 레지스터ESP32-C3 보드
CPU 상태범용/세그먼트/IP/제어 레지스터 · 플래그PC · CPSR · LR · SP
메모리스택 · 힙부트 절차 · 폰노이만 · 파이프라인Advanced OPS(메모리·비트 조작)
실습Program/Debug/Hack ×6ADD 등 명령어별동일 패턴PlatformIO 프로젝트

이 반복이 지루함이자 강점이다. 이미 x86을 뗀 사람이 ARM 코스를 들으면 앞부분 10강은 거의 복습이라 지루하다. 하지만 "레지스터"라는 같은 이름이 아키텍처마다 몇 개이고 어떤 규칙으로 쓰이는지를 나란히 놓고 보게 되므로, ISA(명령어 집합 구조)라는 개념이 추상적 지식에서 구체적 감각으로 바뀐다.

솔직한 한계 세 가지

한계 1
"리버싱 강의"인데 실전 리버싱 비중이 생각보다 작다

제목만 보면 맬웨어 분석·바이너리 크랙을 기대하게 되는데, 실제 550강의 절반 이상은 어셈블리 프로그래밍과 임베디드 드라이버 작성이다. RP2350 드라이버 6코스 180강 + Assembler 24강 + Embedded Hacking 40강만 해도 244강이다. 리버싱의 기반 체력(어셈블리 독해력)을 기르는 데는 최고지만, "패킹된 맬웨어를 언패킹하는 법" 같은 실전 기법은 이 커리큘럼의 범위가 아니다. 기대치를 맞춰 두는 게 좋다.

한계 2
Windows·Visual Studio 중심 — 환경 진입장벽이 있다

로컬 예제 7종이 전부 Visual Studio 솔루션(.sln/.vcxproj)이고, 대상은 Win32 API다. macOS나 리눅스만 쓰는 사람은 이 부분을 그대로 따라 할 수 없다(VM이 필요하다). 반대로 후반 임베디드 코스는 PlatformIO·Rust 툴체인이라 크로스 플랫폼이다. 코스마다 요구 환경이 다르다는 걸 시작 전에 확인해야 시간을 아낀다.

한계 3
무료 교육이지만 판매 퍼널이 붙어 있다

README 최상단에 Discord 초대하드웨어 배지 $29.99 판매 링크(유튜브 프로모 영상 포함)가 배치돼 있다. 강의 자체는 전부 무료이고 Apache-2.0이므로 부정직한 구조는 아니다. 다만 "완전 무료 교육 자료"를 기대하고 들어왔다가 상단 절반이 홍보인 걸 보면 인상이 갈린다. 사실로 인지하고 스크롤을 내리면 그만이다. 배지 자체도 저장소에 암호 엔진 문서·수식 11종이 공개돼 있어 학습 자료로서의 값어치는 실재한다.

7준비물 — 소프트웨어와 하드웨어

코스마다 다르다. 시작 전에 여기서 확인
코스 계열필요한 것비용
x86 · x64 (레슨 1–163)Linux(VM 가능) · NASM/GAS · GDB · vim. 강의가 리눅스 설치와 vim 사용법부터 가르친다무료
Hacking Windows (204–233)Windows + Visual Studio(MASM 포함) · x64dbg 또는 IDA/Ghidra무료(VS Community)
로컬 예제 0x0001–0x0013Visual Studio · 디스어셈블러. 커밋된 .i64는 IDA Pro용 — Ghidra로 .exe를 직접 열 것무료(Ghidra) / IDA Pro는 유료
ARM-32/64 (41–183)라즈베리파이 또는 QEMU ARM 에뮬레이션무료~5만원대
Pico · RP2350 (184–203, 342–521)Raspberry Pi Pico 2 (RP2350) · SWD 디버그 프로브 · Pico SDK1~2만원 + 프로브
Hacking Bits · Assembler (323–332, 527–550)ATmega328P(아두이노 우노) · 브레드보드 · LCD/시프트레지스터/모터/릴레이/IR 등 부품 · avr-gcc·avrdude부품 키트 3~5만원
Hacking RISC-V (333–341)ESP32-C3 개발보드 · PlatformIO1만원 내외
Embedded Rust · Wasm (261–271, 522–526)Rust 툴체인 · Embassy · wasm32 타깃 · RP2350 또는 micro:bit무료 + 보드
돈 안 쓰고 시작하는 법
보드 없이 갈 수 있는 데까지: 레슨 1–260

x86 · ARM-32 · x64 · ARM-64 · Hacking Windows · Go · Rust까지 약 260강은 하드웨어가 전혀 필요 없다. ARM 파트도 QEMU 에뮬레이션으로 대체 가능하다. 여기까지 완주한 뒤에도 계속하고 싶으면 그때 보드를 사는 게 합리적이다. 먼저 reversing-for-everyone.pdf를 내려받아 두는 것이 첫 단계다(§4 불편 2 참고).

8직접 해볼 수 있는 실습 과제

이 저장소를 '읽는' 게 아니라 '쓰는' 방법
과제 1 · 입문

21줄 어셈블리를 Ghidra로 되돌려 보기 난이도 ★☆☆ · 30분

0x0001-hello_world-x86 Debug/.exeGhidra로 열고, 디스어셈블 결과를 §5의 main.asm 원본과 한 줄씩 대조한다. push 순서가 인자 순서의 역순인 이유, MessageBoxA가 어떻게 임포트 테이블에 잡히는지를 확인하면 성공. 그다음 x64판으로 같은 걸 해서 인자 전달이 레지스터로 바뀐 것을 눈으로 확인한다.

과제 2 · 입문

커리큘럼을 내 것으로 재정렬하기 난이도 ★☆☆ · 1시간

README를 파싱해 레슨 번호 · 코스명 · 제목 · 링크를 CSV나 JSON으로 뽑는 스크립트를 짠다(정규식 ^## Lesson (\d+): (.+?) \((.+)\)부터 시작하면 된다). 그런 다음 내 목표에 맞는 순서로 재정렬한 개인 학습 플랜을 만든다. §4에서 지적한 "레슨 번호로 점프할 수 없다"는 문제를 스스로 해결하는 셈이고, 덤으로 진도 체크리스트가 생긴다.

과제 3 · 중급

Program → Debug → Hack을 내 코드로 1세트 난이도 ★★☆ · 반나절

커리큘럼을 따라가는 대신 패턴만 빌려온다. (a) C로 "비밀번호를 맞히면 통과"하는 20줄짜리 프로그램을 짠다. (b) GDB나 x64dbg로 한 줄씩 실행하며 비교 명령(cmp)과 분기(jne)를 찾는다. (c) 그 분기를 바이트 단위로 패치해 어떤 비밀번호를 넣어도 통과하게 만든다. 이 한 세트를 완주하면 550강의 핵심 사이클을 몸으로 이해한 것이다.

과제 4 · 중급

같은 코드, 세 아키텍처 비교 난이도 ★★☆ · 반나절

int add(int a, int b) { return a + b; } 딱 하나를 x86-64 · ARM64 · RISC-V로 각각 컴파일한다(리눅스에서 크로스 컴파일러 3종이면 되고, 보드는 필요 없다). objdump -d로 세 결과를 나란히 놓고 인자가 어느 레지스터로 오는지 · 반환값이 어디로 가는지 · 함수 프롤로그/에필로그가 어떻게 다른지를 표로 정리한다. 이 커리큘럼이 6종 아키텍처를 반복하는 이유를 30분 만에 체감할 수 있다.

과제 5 · 심화

Go와 Rust 바이너리는 왜 다른가 난이도 ★★★ · 하루

Hello World를 C · Go · Rust로 각각 컴파일해 파일 크기와 함수 개수를 비교한다. C는 수십 KB인데 Go는 1MB를 훌쩍 넘고, 심볼 테이블에 runtime.* 함수가 수천 개 뜬다. 왜 그런지(정적 링크된 런타임·가비지 컬렉터·고루틴 스케줄러) 조사하고, "언어별로 리버싱 난이도가 왜 다른가"를 한 페이지로 정리한다. 이 커리큘럼의 Go(12강)·Rust(15강) 코스가 왜 따로 있는지에 대한 답이 여기 있다.

과제 6 · 심화

Assembler 코스 24강을 부품 없이 시뮬레이션 난이도 ★★★ · 며칠

AVR 부품 키트가 없어도 simavr이나 SimulIDE로 ATmega328P를 시뮬레이션할 수 있다. Assembler 코스의 Blink(Ch.2)부터 시프트 레지스터(Ch.16)까지를 시뮬레이터에서 돌려 본다. 실물의 손맛은 없지만 타이머 레지스터 설정과 비트 조작이라는 핵심은 그대로 배울 수 있고, 나중에 보드를 샀을 때 바로 써먹을 수 있다.

9관련 기술 심화 학습 로드맵

이 커리큘럼이 안 다루는 것들로 뻗어 나가기

갈래 A — 도구를 제대로

이 커리큘럼은 개념 중심이라 도구 숙련은 따로 채워야 한다. 무료 경로로는 Ghidra(NSA 공개 · 디컴파일러 내장 · 스크립팅 가능)가 중심이고, 동적 분석은 x64dbg(Windows) · GDB + pwndbg/GEF(Linux)다. 여기에 Frida(실행 중 프로세스에 JS로 후킹)를 얹으면 모바일 앱과 게임 분석까지 열린다. 저자가 만든 Ghidra 플러그인 G-AVR·G-Pulley를 읽어 보면 디스어셈블러를 확장하는 법도 배울 수 있다.

갈래 B — 실전 리버싱(이 커리큘럼의 다음 단계)

§6 한계 1에서 짚었듯 실전 기법은 범위 밖이다. 이어서 볼 것: 패킹/언패킹(UPX부터 시작), 안티디버깅 우회, 바이너리 diffing(BinDiff — 패치 전후를 비교해 취약점을 역산), 심볼릭 실행(angr). 훈련장으로는 crackmes.onepwnable.kr, 그리고 이 저장소 저자가 만든 DC540 CTF 9종(dc540-0x00001~0x00009)이 바로 이어지는 난이도다.

갈래 C — 컴파일러 쪽에서 내려오기

리버싱은 결국 컴파일러가 한 일을 거꾸로 읽는 것이므로, 컴파일러를 알면 속도가 붙는다. Compiler Explorer(godbolt.org)에서 C 코드를 치면 어셈블리가 실시간으로 나오는데, -O0-O2를 토글하며 최적화가 코드 구조를 얼마나 뭉개는지 보는 게 가장 효율적인 훈련이다. 그다음 ABI 문서(System V AMD64 · AAPCS64 · RISC-V calling convention)를 직접 읽으면, 과제 4의 비교표가 "왜 그런지"까지 설명된다.

갈래 D — 임베디드·펌웨어 보안

이 커리큘럼의 후반 무게중심이 여기다. 이어서 볼 것: 펌웨어 추출(SPI 플래시 덤프 · JTAG/SWD), binwalk로 펌웨어 이미지 해부, 글리칭/폴트 인젝션(전압·클럭을 흔들어 보안 검사를 건너뛰기), 사이드채널 분석. Ouroboros 배지의 암호 엔진 문서(LFSR · ARX · Davies-Meyer · CTR 모드 수식 11종)가 경량 암호 구현을 실물로 뜯어보는 좋은 출발점이다.

용어 풀이
ISA (Instruction Set Architecture, 명령어 집합 구조)
CPU가 이해하는 명령어의 목록과 규칙. "이 비트 패턴은 덧셈이고, 레지스터는 몇 개이며, 함수 인자는 어디로 넘긴다"까지가 다 ISA다. x86-64 · ARM64 · RISC-V가 서로 다른 ISA이고, 같은 C 코드도 ISA가 다르면 완전히 다른 기계어가 된다. 리버싱이 아키텍처별로 따로 배워야 하는 이유가 이것이고, 이 커리큘럼이 6종을 반복하는 이유이기도 하다. RISC-V가 특별한 건 개방형이라 누구나 로열티 없이 구현할 수 있다는 점이다.

10핵심 키워드 사전

이 문서에 나온 용어 한 줄 정리
용어
리버스 엔지니어링컴파일된 프로그램에서 원래 동작·설계를 되짚어 내는 일. 소스·주석·변수명이 없는 상태에서 시작
정적 분석실행하지 않고 디스어셈블러로 코드를 읽는 방식. 악성코드에 안전
동적 분석디버거로 실제 실행하며 레지스터·메모리 변화를 관찰하는 방식
디스어셈블러기계어 → 어셈블리 텍스트로 되돌리는 도구. IDA(유료) · Ghidra(무료) · objdump
디컴파일러한 단계 더 나아가 C 비슷한 의사코드까지 복원. Ghidra에 내장
ISA명령어 집합 구조. CPU가 이해하는 명령어 목록과 규칙. x86-64 · ARM64 · RISC-V 등
레지스터CPU 안의 초고속 저장소 몇 개. 아키텍처마다 개수·이름·용도 규칙이 다르다
스택 / 힙지역변수·함수 호출 흔적이 쌓이는 영역 / 실행 중 크기가 정해지는 동적 할당 영역
호출 규약함수 인자를 어디로 넘기고 스택은 누가 치우는지에 대한 약속. stdcall · cdecl · System V 등
name decorationMessageBoxA@16처럼 인자 크기를 이름에 붙이는 것. 인자 개수 역산의 단서
MASM / NASMMicrosoft / Netwide 어셈블러. 문법이 다르지만 같은 x86 기계어를 낸다
ATmega328P아두이노 우노의 8비트 AVR 마이크로컨트롤러. Assembler 코스의 주 무대
RP2350Raspberry Pi Pico 2의 칩. ARM 코어와 RISC-V 코어를 둘 다 갖고 있어 비교 학습에 이상적
ESP32-C3RISC-V 코어를 쓰는 저가 Wi-Fi 마이크로컨트롤러. RISC-V 코스의 보드
WebAssembly (Wasm)브라우저용으로 만들어진 이식 가능한 바이트코드. 최근엔 마이크로컨트롤러에도 올린다
Embassy임베디드 Rust용 비동기 프레임워크. Embedded Rust 코스에서 사용
PlatformIO여러 보드·툴체인을 한 설정으로 다루는 임베디드 개발 환경
Fritzing (.fzz)브레드보드 회로도 편집기 파일. 저장소에 회로도 3종의 원본이 포함
linguist-detectableGitHub 언어 통계에 특정 확장자를 포함/제외하는 .gitattributes 설정

11참고 링크

원문으로 더 파고들기