[리버싱 핵심원리] ch02. Hello World! 리버싱

2022. 12. 26. 18:00· Reverse Engineernig/study
목차
  1. < 리버싱 핵심원리 소스코드/실습예제 파일다운 >
  2. 1. Hello World 프로그램
  3. 2. HelloWorld.exe 디버깅
  4.  
  5.  2.1 Hello world 디버깅 목표
  6. 2.2 HelloWorld.exe. 디버깅 시작
  7. 2.3 EP (Entry Point)
  8. 2. 4 40270C 함수 따라가기
  9. 2.5  40104F 점프문 따라가기
  10. 2.6 Main() 함수 찾기
  11. 3. 디버거 능숙하게 다루기
  12.  
  13. 3.1 디버거 명령어
  14. 3.2  베이스 캠프
  15. 4. 원하는 코드 빨리 찾아내는 4가지 노하우
  16. 4.1 코드 실행 방법
  17. 4.2  문자열 검색 방법
  18. 4.3  API 검색 
  19. 5. " Hello World!"  문자열 패치
  20.  
  21.  5.1 패치
  22. 5.2 문자열 패치 방법 (1) - 문자열 버퍼를 직접 수정하기
  23. 5.2 문자열 패치 방법 (2) - 다른 메모리 영역에 새로운 문자열을 생성하여 전달

< 리버싱 핵심원리 소스코드/실습예제 파일다운 >

https://reversecore.com/104

 

"리버싱 핵심 원리" 소스 코드와 실습 예제 파일입니다.

(2021.07.08) github.com 에도 제 계정을 생성하여 소스코드 및 실습예제를 올렸습니다. github 에 익숙하신 분들께서는 이곳을 이용하시면 됩니다. https://github.com/reversecore/book 1. 소스 코드 (ver 1.0.2) * 암

reversecore.com

 

1. Hello World 프로그램

  • Release 모드로 HelloWorld.exe 를 만들어 보자( Release 모드로 컴파일하면 코드가 간결해져 디버깅하기 편하다)
//HelloWorld.cpp

#include "windows.h"
#include "tchar.h"

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

HelloWorld!.exe 실행화면

 

2. HelloWorld.exe 디버깅

 

 2.1 Hello world 디버깅 목표

  • 어셈블리 언어로 변환된 main() 함수 찾기
  • 기본적인 디버거 사용법 학습
  • 어셈블리 명령어 학습

 

2.2 HelloWorld.exe. 디버깅 시작

 

 

(1) Code Window

  • 기본적으로 diassembly Code 를 표시한다.
  • 각종 comment, label 을 보여준다.
  • 코드를 분석하여 loop, jump, 위치등의 정보를 표시한다.

(2) Register Window

  • CPU Register 값을 실시간으로 표시한다.
  • 특정 Register의 값은 수정도 가능하다.

(3) Dump Window

  • 프로세스에서 원하는 memory 주소 위치의 값을 hex와 asscii/유니코드 값으로 표시한다.
  • 수정가능

(4) Stack Window

  • ESP Register가 가리키는 프로세스 Stack Memory를 실시간으로 표시한다.
  • 수정가능

 

2.3 EP (Entry Point)

  • 엔트리 포인트(Entry Point)는 제어가 운영 체제에서 컴퓨터 프로그램으로 이동하는것을 말하며, 프로세서는 프로그램이나 EP가 코드에 진입해서 실행을 시작한다. 
  • PE 파일을 분석해서 EP값을 알아 낼 수도 있다.

exe 파일을 디버거에 올렸을때 첫 화면

> 위 사진과 같이 Hello World.exe를 디버거로 열었을때 EP(Entry Piont)에서 멈추는걸 알수 있다.

 

(1) address

  • 프로세스의 가상 메모리 (Virtual Address:VA) 내의 주소

(2) instruction

  • IA-32(또는 x86) CPU 명령어

(3) Disassembled Code

  • OP 코드를 보기 쉽게 어셈블리어로 변환한 코드

(4) Comment

  • 디버거에서 추가한 주석 ( 옵션에 따라 약간 다르게 보임)

 

2. 4 40270C 함수 따라가기

> 이제 Main() 함수를 찾기위해 Step into 명령어 [F7] 를 사용해 40270C 함수 코드 내부로 들어가보자

40270C 함수 내부

함수 내부로 들어오자 새로운 코드들이 나타난다. 먼저 주석에서는 코드에서 호출되는 API 함수이름을 보여준다. 우리는 이미 Main() 함수가 어떻게 생긴지 알기때문에  이번에는 Step over 명령어 [F8] 을 사용해 함수 내부로 진입하지 않고 하나하나 실행해보자 ( Ctrl + [F9]  명령어 사용시 함수의 RET까지 빠르게 실행 할수 있다)

 

40270C 함수의 끝부분 (RETN)

4027A1 주소에 RETN 명령어가 있는걸 알수있다. RETN은 함수의 끝에서 사용되며 이 함수가 호출된 원래 주소 쪽으로 되돌아간다. 위 경우는 리턴주소가 4011A5이다. [F8]을 눌러 리턴주소로 이동하자

 

4027A1 에서 RETN 명령어 실행후 4011A5로 이동

 

2.5  40104F 점프문 따라가기

4011A5 주소의 JMP 40104F 명령을 실행( [F8] ) 해서 해당 주소로 가보자

jmp 40104F 실행 결과

다시 40104F 주소부터 함수 호출 명령어를 하나하나 따라가보자... 저자께서 처음엔 귀찮더라도 하나하나 다 실행보고 가라고 하셨다

 

2.6 Main() 함수 찾기

 

쭉~~ 따라가 보다 보면

 

 

401144 주소에 CALL 401000 호출하는 명령어가 있는데 Step into [F7] 로 들어가보면 MessageBoxW() API를 호출하는 코드를 확인 할 수 있다. 그 API의 파라미터가 "www.reversecore.com"과 "Hello World!" 문자열인것으로 보아 우리가 찾던 Main() 함수인걸 알 수 있다.

 

 

 

3. 디버거 능숙하게 다루기

 

3.1 디버거 명령어

명령어 단축키 설명
Step Into  F7 하나의 OP code 실행(함수 내부로 들어감)
Step Over F8 하나의 OP code 실행(함수 내부로 안 들어감)
Restart Ctrl+F2 다시 디버깅시작(프로세스 종료하고 재실행시킴)
Go to  Ctrl+G 원하는 주소 찾아감(코드 확인할때 사용, 실행되는 것은 아님)
Run  F9 실행(BP 걸려있으면 그 곳에서 실행 정지)
Execute till return  Ctrl+F9 함수 코드 내에서 RETN 명령까지 실행(함수 탈출 목적)
Execute till cursor  F4 cursor 위치까지 실행(디버깅 주소까지 바로 갈 수 있음)
Comment : Comment 추가
Edit data Ctrl + E 데이터 편집
Assemble  Space 어셈블리 코드 작성및 수정

 

 

3.2  베이스 캠프

  • 디버거를 재실행할 때마다 매번 EP 코드부터 새로시작 → 비효율적
  • 코드 중간주간에 분석을 원하는 중요 포인트(주소)를 지정하여 그 포이트로 빠르게 이동하여 분석하는게 효율적          →등산에서 베이스 캠프와 같은 역할

 

● 베이스 캠프 설정법 

  •  Goto 명령어 사용 [Ctrl + G] 후, [F4]명령으로 커서까지 프로그램 실행
  • BP 설정 [F2]
  • 주석 삽입 [ ; ] 
  • 레이블 설정 [ : ]

 

4. 원하는 코드 빨리 찾아내는 4가지 노하우

 

4.1 코드 실행 방법

  • 디버거로 Step over [F8] 을 반복 수행하면서, 분석자가 확인할 수 있는 상황이 나타날 때까지 계속 실행한다.

 

4.2  문자열 검색 방법

  • 프로그램 내에서 사용되는 "문자열"을 확인
  • Code Window 에서 [우측마우스]  → [seacrh for] → [Current Modules] → [All Referenced text strings]

검색 하려는 문자열을 더블 클릭하거나 Goto 명령어를 사용하여 이동할 수 있다.

 

 

4.3  API 검색 

  • 사용된 API를 검색
  • Code Window 에서 [우측마우스]  → [seacrh for] → [Current Modules] → [All intermodular calls]

원하는 API 확인후 더블클릭하거나 Goto 명령어로 이동

 

 

5. " Hello World!"  문자열 패치

 

 5.1 패치

  • 패치 대상 : 파일 or 메모리 / 코드 or 데이터
  • 목표 : 메시지 박스의 " Hello World!"를 다른 문자로 변경

 

 

5.2 문자열 패치 방법 (1) - 문자열 버퍼를 직접 수정하기

  • 덤프 창에서 Goto 명령으로 문자열 주소로 이동

 

  • 마우스로 변경할 메모리 전체 선택

 

  • [Ctrl + E]  명령어를 사용해 문자열 수정

 

🔴 주의할점! 

→ 문자열 입력시 문자열 길이에 주의해야하는데,  유니코드 문자열은 2바이트 NULL로 끝나야한다.

→ 유니코드 항목에는 NULL을 입력할 수 없으므로 HEX 항목에다 NULL을 입력한다.

 

  • 실행

 

 

 

5.2 문자열 패치 방법 (2) - 다른 메모리 영역에 새로운 문자열을 생성하여 전달

  • 덤프 창에서 문자열을 저장할 영역 선택( 409F50)

 

 

  • [Ctrl + E] 명령어로 유니코드에 문자열 저장

 

 

  • 401007코드창에서 space 바를 누른후 PUSH 409F50 으로 수정

 

 

  • 실행

 

 

저작자표시 (새창열림)

'Reverse Engineernig > study' 카테고리의 다른 글

[리버싱 핵심원리] ch05. 스택  (0) 2022.12.27
[리버싱 핵심원리] ch04. IA-32 Register 기본 설명  (0) 2022.12.27
[리버싱 핵심원리] ch03. 리틀 엔디언 표기법  (0) 2022.12.26
[리버싱 핵심원리] ch01. 리버싱 스토리  (0) 2022.12.26
[Assembly]어셈블리어 명령어 모음  (0) 2022.06.08
  1. < 리버싱 핵심원리 소스코드/실습예제 파일다운 >
  2. 1. Hello World 프로그램
  3. 2. HelloWorld.exe 디버깅
  4.  
  5.  2.1 Hello world 디버깅 목표
  6. 2.2 HelloWorld.exe. 디버깅 시작
  7. 2.3 EP (Entry Point)
  8. 2. 4 40270C 함수 따라가기
  9. 2.5  40104F 점프문 따라가기
  10. 2.6 Main() 함수 찾기
  11. 3. 디버거 능숙하게 다루기
  12.  
  13. 3.1 디버거 명령어
  14. 3.2  베이스 캠프
  15. 4. 원하는 코드 빨리 찾아내는 4가지 노하우
  16. 4.1 코드 실행 방법
  17. 4.2  문자열 검색 방법
  18. 4.3  API 검색 
  19. 5. " Hello World!"  문자열 패치
  20.  
  21.  5.1 패치
  22. 5.2 문자열 패치 방법 (1) - 문자열 버퍼를 직접 수정하기
  23. 5.2 문자열 패치 방법 (2) - 다른 메모리 영역에 새로운 문자열을 생성하여 전달
'Reverse Engineernig/study' 카테고리의 다른 글
  • [리버싱 핵심원리] ch04. IA-32 Register 기본 설명
  • [리버싱 핵심원리] ch03. 리틀 엔디언 표기법
  • [리버싱 핵심원리] ch01. 리버싱 스토리
  • [Assembly]어셈블리어 명령어 모음
po3nyo
po3nyo
po3nyo
공부기록장
po3nyo
전체
오늘
어제
  • 분류 전체보기 (208)
    • Programming (13)
      • HTML (0)
      • JavaScript (1)
      • CSS (1)
      • PHP (1)
      • Java (2)
      • Database (7)
      • Python (1)
      • C (0)
    • Web Hacking (28)
      • Web (14)
      • DVWA (12)
      • Bee-Box (0)
    • Reverse Engineernig (11)
      • study (11)
      • lena (0)
    • System Hacking (0)
    • Forensics (0)
    • Cryptography (0)
    • Wargame (58)
      • root-me.org (19)
      • webhacking.kr (0)
      • los.rubiya.kr (0)
      • TryHackMe (0)
      • HackerFactory.co.kr (0)
      • dreamhack.io (0)
      • picoctf.org (27)
      • Hackme.org (11)
      • CTF (1)
    • OS (6)
      • Windows (1)
      • LINUX (5)
    • Algorithm (22)
      • BOJ (22)
      • 기타 (0)
    • Tools (14)
    • Etc (7)
    • 알쓸신잡 (5)
    • 전공 (40)
      • 운영체제 (11)
      • 정보통신 (13)
      • 소프트웨어공학 (9)
      • 컴퓨터 구조 (7)

블로그 메뉴

  • 방명록

공지사항

인기 글

태그

  • Hackme.org
  • Hackmechallenge
  • picoCTF
  • 취약점
  • 침투
  • sql 분법
  • 정보통신
  • 웹해킹
  • wirteup
  • ceate
  • writeup
  • 정보보호
  • OWASP
  • dvwa
  • dvwa실습
  • 모의해킹
  • 정보보안
  • SQL
  • 알쓸신잡
  • Python
  • rootme
  • sql 조건문
  • html
  • php
  • 레코드 제한
  • Infosec
  • mus1c
  • order by절
  • sql 데이터타입
  • rootmeorg

최근 댓글

최근 글

🔒 · Designed By 정상우.v4.2.2
po3nyo
[리버싱 핵심원리] ch02. Hello World! 리버싱
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.