본문 바로가기
일반IT/IT보안

[실습] "AI야, 그 말 진짜야?" 🤨 AI 분석 결과와 어셈블리(Assembly) 코드 교차 검증하기

by gasbugs 2025. 12. 11.

안녕하세요, 보안 꿈나무 여러분! 🌱

지난 시간에는 AI에게 복잡한 코드를 던져주고 "이게 무슨 기능이야?"라고 물어보는 치트키를 썼습니다. AI가 "이건 랜섬웨어 암호화 로직입니다!"라고 딱 알려주니 정말 편했죠?

하지만 잠깐! ✋

"보안 분석가는 의심하는 것이 직업입니다."

AI는 정말 똑똑하지만, 가끔 없는 사실을 지어내거나(Hallucination), 뉘앙스를 틀리게 해석할 때가 있습니다. AI가 "암호화"라고 했지만 실제로는 그냥 "인코딩"일 수도 있고, "삭제"라고 했지만 "이동"일 수도 있죠.

그래서 오늘은 AI의 설명을 '참고자료'로 삼아, 실제 '진실의 방'인 어셈블리(Assembly) 코드와 대조해 보는 법을 배울 겁니다. 이 과정을 거쳐야 비로소 "분석 끝!" 도장을 찍을 수 있거든요.

어셈블리어, 어렵지 않습니다. 딱 3가지 포인트만 확인하면 됩니다! 🧐


1. 왜 굳이 어셈블리를 봐야 하죠? (C 코드도 있는데...)

기드라의 디컴파일(C 형태) 화면은 가끔 우리를 속입니다.

  1. 생략된 정보: 컴파일러 최적화 과정에서 중요한 변수가 사라지기도 합니다.
  2. AI의 오해: AI는 변수명이나 함수 구조만 보고 "이건 AES 암호화네요"라고 단정 짓지만, 실제 뜯어보면 단순 XOR인 경우가 많습니다.

"AI의 주장을 팩트체크(Fact Check)하는 것", 그게 바로 리버스 엔지니어링의 핵심 역량입니다.


2. 준비물: 화면 세팅 🖥️

기드라 화면을 듀얼로 봅니다.

  • 왼쪽: 리스팅(Listing) 뷰 -> 어셈블리어 (진실)
  • 오른쪽: 디컴파일(Decompile) 뷰 -> C언어 (해석본)
  • 창 밖: AI와의 대화창 -> 요약본 (주장)

3. 실전 검증: AI의 주장 vs 어셈블리 팩트 🥊

지난번 랜섬웨어 예시를 그대로 가져와 검증해 보겠습니다.

💬 AI의 주장 (지난 시간 결과)

"이 함수는 반복문(Loop)을 돌면서 파일 데이터와 키 값을 XOR 연산하여 암호화를 수행합니다."

자, 이제 눈을 크게 뜨고 왼쪽 **리스팅 뷰(Assembly)**에서 증거를 찾아봅시다.

✅ Check Point 1. 진짜 반복문이 있는가? (Loop)

AI가 "반복문이 있다"고 했습니다. 어셈블리에서 반복문은 보통 **비교(CMP)**와 **점프(JMP/JNZ)**의 조합으로 나타납니다.

  • 어셈블리 코드 찾기:
LAB_1400012f0:              ; 반복 시작 지점 라벨
   ...
   INC  EAX                ; EAX (카운터 i) 값을 1 증가 (++i)
   CMP  EAX, ECX           ; EAX(i)와 ECX(파일크기)를 비교 (i < size ?)
   JL   LAB_1400012f0      ; i가 더 작으면(JL) 다시 라벨로 점프(Jump)
  • 검증 결과: CMP(비교)와 JL(Jump If Less) 명령어가 보이네요. 빙글빙글 도는 구조가 맞습니다. (AI 설명 일치! ⭕)

✅ Check Point 2. 진짜 XOR 연산을 하는가? (Logic)

가장 중요한 부분입니다. AI가 "XOR 암호화"라고 했습니다. 만약 여기서 ADD나 SUB가 나오면 AI가 틀린 겁니다.

  • 어셈블리 코드 찾기:
MOV  EDX, [RBP + local_var] ; 데이터를 레지스터로 가져옴
MOV  EAX, [RBP + key_var]   ; 키 값을 가져옴
XOR  EDX, EAX               ; ⭐ 여기다! XOR 연산 수행!
MOV  [RBP + local_var], EDX ; 결과를 다시 메모리에 저장
  • 검증 결과: 떡하니 XOR 명령어가 있습니다. 만약 여기가 AESENC(AES 암호화 명령어)였다면 "고급 암호화", 그냥 XOR라면 "단순 암호화"입니다. 눈으로 확인했으니 확실하군요. (AI 설명 일치! ⭕)

✅ Check Point 3. 함수 호출 확인 (API Call)

AI가 "마지막에 파일을 덮어쓴다"고 했습니다. 파일을 쓰려면 운영체제한테 부탁해야겠죠?

  • 어셈블리 코드 찾기:
PUSH ...                    ; 파라미터 넣기
CALL dword ptr [->WriteFile] ; ⭐ WriteFile API 호출!
TEST EAX, EAX               ; 성공했는지 확인
  • 검증 결과: CALL 명령어 뒤에 WriteFile이라는 윈도우 API 이름이 명확히 보입니다. 파일 쓰기 행위가 팩트임이 증명되었습니다. (AI 설명 일치! ⭕)

4. 만약 AI가 틀렸다면? (Hallucination 사례) ⚠️

가끔 이런 경우가 발생합니다.

  • AI: "이 코드는 RSA 비대칭 키를 생성합니다."
  • 실제 어셈블리:
CALL rand      ; 랜덤 숫자 생성
MOV [key], EAX
  • 분석가의 판단: "아니네? 그냥 rand() 함수 써서 랜덤 숫자 하나 만드는 거네? RSA 같은 거창한 게 아니잖아!"

👉 이 순간이 바로 여러분이 AI를 이기는 순간입니다. 이 내용을 분석 보고서에 "AI 오진 수정: RSA 아님, 단순 랜덤 키 생성임"이라고 적으면 됩니다.


5. 초보자를 위한 어셈블리 매핑 표 📝

AI의 설명을 검증할 때 자주 쓰이는 명령어 짝꿍들입니다. 이것만 외워도 80%는 먹고 들어갑니다!

AI 설명 (C언어) 찾아야 할 어셈블리 명령어 (Opcode) 의미
함수 호출 (Call) CALL 다른 함수로 이동
조건문 (If) CMP, TEST + JZ, JNZ 비교하고 점프하기
반복문 (For/While) JMP, LOOP 특정 위치로 되돌아가기
변수 대입 (=) MOV, LEA 값 복사하기/주소 가져오기
산술 연산 (+, -) ADD, SUB, INC, DEC 더하기, 빼기
논리 연산 (&, ^) AND, OR, XOR 비트 연산 (암호화에서 중요!)
종료 (Return) RET 함수 끝내고 돌아가기

🎉 실습 마무리

오늘은 AI라는 통역사가 해준 말을 맹신하지 않고, 어셈블리라는 원문을 확인하며 교차 검증(Cross Validation) 하는 법을 배웠습니다.

  1. AI에게 전체 그림을 듣는다. 👂
  2. 어셈블리 뷰에서 핵심 명령어(XOR, CALL, CMP) 가 있는지 눈으로 찍는다. 👀
  3. 일치하면 통과, 다르면 내 눈을 믿는다. 👁️

이 습관이 들면, 여러분은 더 이상 "툴만 돌리는 스크립트 키디"가 아니라, **"코드의 진실을 꿰뚫어 보는 진정한 분석가"**가 되는 겁니다.

다음 시간에는 이렇게 정적 분석으로 파악한 내용을 실제 실행했을 때 눈으로 확인하는 동적 분석(Dynamic Analysis) 단계로 넘어가 보겠습니다.

어셈블리, 쫄지 마세요! 까보면 별거 아닙니다! 화이팅! 💪