리버싱 핵심원리

1: OllyDbg + helloworld.exe

whydontyoushovel 2025. 1. 30. 18:14

 

  • OllyDbg : 32비트 바이너리 코드 디버깅 툴
  • 디버깅 : 동적 분석 -> 프로그램 실행하면서 분석하는 방법
  • *디컴파일 : 정적 분석 -> 프로그램 실행X. 바이너리 코드를 어셈블리어나 자바 등의 고급언어로 변환하여 흐름을 분석

 

 

   OllyDbg 화면       

    

1: 주소창

2: 기계어

3: 어셈블리어

 

    

1: Code Window

2: Register Window

3: Dump Window (메모리 덤프=>주소, HEX Dump, ASCII)

4: Stack Window (스택 주소, 값, comment)

 

 

https://iforint.tistory.com/43?category=1134087

 

ollydbg :: 02 용도 및 사용법

0. 용도 OllyDbg : 개발한 Oleh Yuschuk 의 이름을 딴, 바이너리 코드 분석을 위한 x86 디버거이다. 소스 코드가 없을 때 유용하게 사용된다. - 레지스터 추적 - 함수, API 호출 - Switch 문, table, 상수, 문자열

iforint.tistory.com

 

 

 

 

 

   스탭 별 명령어(단축키)       

1) 40270C 함수 따라가기

단축키 명령어 설명
Ctrl + F2 Restart 처음부터 디버깅 시작 (현재 프로세스 종료하고 재실행)
F7 Step Into 하나의 OP코드(CPU명령어) 실행 (함수 내부로 들어감)
F8 Step Over 하나의 OP코드(CPU명령어) 실행 (함수 안 들어가고 걍 실행)
Ctrl + F9 Execution till Return 함수 코드 내에서 RETN 명령어까지 실행 (그 후 F7,8 누르면 함수 탈출)

 

 

 

 

   HelloWorld.exe 돌아다니기       

▷ 파일 동작

Hello World! 메시지 박스를 출력하고 있음
버튼은 "확인" 버튼 하나
창 제목은 "www.reversecore.com"

 

  • 소스 코드
#include "windows.h"
#include "tchar.h"

int _tmail(int argc, TCHAR *argv[])
{
    MessageBox(NULL,
               L"Hello World!",
               L"www.reversecore.com",
               MB_OK);
               
    return 0;
}

 

 

용어

더보기

1) VA: 프로세스의 가상 메모리

2) Stub Code: 컴파일러가 임의로 추가시킨 코드로, EP 코드 영역에 추가된 Stub Code는 Startup Code라고도 부름

                       개발 도구의 버전이나 종류에 따라 모습이 다름

 

▷ main 함수 찾기

1) EP (Entry Point)

EP 코드: 들어가자마자 만나는 코드
HelloWorld.exe의 실행 시작 주소 => 4011A0
CALL: 함수 호출 (40270C 함수 호출)
  • F7 누르고 함수 내부로 들어감

 

2) 40270C 함수

어쩌구 저쩌구 Stub Code 한 바가지
빨간색 글씨: 코드에서 호출되는 API 함수 이름
(소스코드에 쓴 적 없는데도 있음 -> 컴파일러가 씀 == Stub Code)
  • Ctrl + F9로 RTRN 명령어까지 한번에 가기
  • F7,8로 함수 나가기

40270C 함수 탈출하여 다음 주소인 4011A5에 도착
  • F7 혹은 8로 40104F 주소로 점프 

 

3) 40104F로 점프

  • F7로 쭉 가다가 401056에서 402524 함수 호출해보기

Stub Code
  • Ctrl + F9로 RETN 명령어까지 슝
  • F7로 나옴

402524 함수에서 나온 바로 다음 주소인 40105B 주소에서 F7 혹은 8로 쭉 내려오다가
40109F 주소에서 4010A5 주소로 점프
4010A5 주소에서 F7 혹은 8로 4010A7로 이동
  • F7로 4024F4 함수 호출

4024F4 함수 내부 (RETN에 화살표 무시하십시오..)
F7로 이동하다가 402509 주소에서 뭔가... 뭔가를 호출

 

영 좋지 못한 곳에 온 느낌
  • Ctrl + F9 눌러 RTRN 명령어로 이동

  • F7 혹은 8 눌러서 탈출

 

  • 영 좋지 못한 함수(?) 호출한 주소의 다음 주소에서 Ctrl + F9 눌러서 다시 리턴 명령어까지 이동

4010A7 주소의 다음인 4010AC 주소로 이동함

 

F7로 내려오다가 4010AF 주소에서 4010B9 주소로 점프(?)
4010B9 에서 F7을 눌러 402367 함수를 호출

402367 함수 내부
주석(Comment) 부분에 빨간 글씨가 쓰여있는 주소는 Call 명령이 있어도 일단 넘어감(Stub Code)
KERNEL32 : 윈도우 시스템의 기본적인 기능을 사용하기 위한 API 함수를 제공
F8로 쭉 지나감

 

4015EA 함수를 호출하고 있는 402434 주소를 만남
  • F7로 4015EA 함수 내부로 들어감

뭔가 엄청 저장하고 호출하는 중
401629까지 갔다가 길 잃음
  • Ctrl + F2 눌러서 리셋

하이

  • 다시.... 다시 401629까지 감..
  • 현재까지 방문한 곳

몇 번을 고쳐 쓰는 건지 모르겠는 맵

  • Ctrl + G 단축키로 401F57 주소로 이동(Go to)

앗! 빠르다! 간편하다!!

 

  • main 함수는 없는 것 같아서 일단 402434 주소의 다음 주소인 402439로 나옴

402439 주소에서 아래로 한 칸 내려와
40243F 주소에서 401F57 함수 호출

 

Stub Code가 한 바가지...
  • 뭐 없어서 Ctrl + F9로 리턴까지 -> 402444 주소로 나옴
  • 그 뒤로도 401F57이 몇 번 더 호출됨
  • 몇 번 더 F8로 내려오다가 40247C 주소 도착

4027C 주소에서 4027F4 함수 호출
  • F8로 쭉 내려옴

40281C 주소에 도착. 40304C 함수 호출 중
F7로 들어가봄
  • 이쪽 CALL에서도 메인 함수는 호출하지 않고 있음..
  • 40247C 주소의 다음 차례인 402481 주소로 나와 다음 함수 호출을 찾아 내려감

F7을 눌러 402490 주소가 호출하는 401FD2 함수로 이동
  • 마찬가지로 원하는 데이터는 없음
  • 402490의 다음 주소인 402495 주소로 나와 다음 주소로 이동함

F7을 눌러 403600 주소로 이동
  • 메인 없음
  • 4024A9 주소의 다음 주소인 4024AE로 나와 다음 탐색
  • .....하다가 402367 쪽엔 없는 것 같아서 4010B9의 다음 주소인 4010BE부터 다시 탐색 시작..
  • 하다가!!!! 401144 주소에서 호출 중인 401000 주소에서 MessageBoxW() api의 호출 코드를 발견

소스코드에서 설정한 데이터를 볼 수 있음
  • 401000 함수 == main() 함수

 

(TRPG의 낭만)

 

더보기

MOV   EDI ,EDI

MOV   EAX ,DWORD PTR DS:[40A004]

MOV   EBX ,FFFF0000

MOV   ESI , DWORD PTR SS:[EBP-4]

 

PUSH   EBP

PUSH   EBX

PUSH   EDI

PUSH   ESI

PUSH   14

 

POP   ECX

 

SUB   ESP ,10

 

CMP   EAX, EDI

CMP   WORD PTR DS:[EAX+400018] ,CX

 

INC  EAX

 

JE   SHORT HelloWor.0040273E

 

NOT   EAX

 

JMP   SHORT HelloWor.0040279E

 

LEA   EAX, DWORD PTR SS:[EBP-8]

 

CALL   DWORD PTR DS:[<&KERNEL32.어쩌구>]

 

XOR   ESI ,EAX

AND   DWORD PTR SS:[EBP-1C] ,0

 

JNZ   SHORT HelloWor.004010A1

 

JBE   SHORT HelloWor.004010A1

 

SETNE   CL

 

SETE   AL

 

TEST   EAX ,EAX

 

INT3

 

JE   HelloWor.004024EF

 

RETN

RETN  0C