cho2cee
TIL
cho2cee
전체 방문자
오늘
어제
  • 전체 게시글 (78)
    • Cloud (31)
      • AWS (12)
      • Kubernetes (16)
      • IaC (3)
    • Security (15)
      • ELK (5)
      • Reversing (10)
    • Network (8)
    • Linux (4)
    • Etc. (20)
      • 기타 (4)
      • 업무 (16)

태그

  • SAA
  • 합격후기
  • AWS
  • CLOUD
  • VPC

최근 댓글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
hELLO
cho2cee

TIL

[Reversing] 02장. Hello World! 리버싱
Security/Reversing

[Reversing] 02장. Hello World! 리버싱

2021. 11. 22. 00:00

1. Hello World 프로그램 

1.1 디버거와 어셈블리 언어 

소스코드(.cpp) ➜ 빌드 ➜ 실행 파일(.exe) 생성 

사람이 이해하기 쉬운 소스코드를 기계가 이해하기 쉬운 기계어로 변환하는 것

기계어는 사람이 알아보기 어렵기 때문에 좀 더 편하게 보기 위해 디버거 유틸리티를 사용한다.

📌 실행 파일을 생성하는 어떠한 프로그래밍 언어라도 빌드 과정을 거치면 모두 기계어로 변환된다. 
디버거를 통해 어떤 실행 파일이라도 어셈블리 언어로 번역해서 볼 수 있기 때문에 리버서는 기본적으로 어셈블리 언어를 잘 알아야 한다. 

어셈블리 언어는 CPU에 종속됨
- 일반 PC 多 사용 : Intel x86 계열 
- 모바일 제품 多 사용 : ARM 계열
➜ 서로 어셈블리 명령어의 형태가 다름

 

2. HelloWorld.exe 디버깅

2.1 디버깅 시작 

💡 OllyDbg는 직관적인 인터페이스와 강력한 확장 가능으로 무장한 Win32 디버거이다. 

 

그림 2.1 Ollydbg로 Hello.exe를 연 화면

 Code window   기본적으로 disassembly code를 표시하여 각종 comment, table을 보여주며, 코드를 분석하여 loop, 
 jump 위치 등의 정보를 표시한다.
 Resgister window  CPU registet 값을 실시간으로 표시하며 특정 register들을 수정도 가능하다. 
 Dump window   프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니코드 값으로 표시하고 수정도 가능하다. 
 Stack window  ESP register가 가리키는 프로세스 stack memory를 실시간으로 표시하고 수정도 가능하다. 

 

2.2 EP(Entry Point) 

EP(Entry Point)는 HelloWorld.exe의 실행 시작 주소(00D811A1)이고,

그림 2.2 HelloWorld.exe의 시작

위 두줄의 의미는 "00D8284C 주소의 함수를 호출(CALL)한 후 00D8104F 주소로 점프(JMP)하라" 이다. 

 

 Address  프로세스의 가상 메모리 내의 주소
 Instruction   IA32 CPU 명령어 
 Disassembled code   OP code를 보기 쉽게 어셈블리로 변환한 코드 
 comment  디버거에서 추가한 주석(옵션에 따라 약간씩 다르게 보임)

 

2.3 00D8284C 함수 따라가기 

Ollydbg 기본 명령어

 명령어  단축키  설명
 Restart  Ctrl+F2  다시 처음부터 디버깅 시작(디버깅을 당하는 프로세스를 종료하고 재실행) 
 Step Into   F7  하나의 OP code 실행(CALL 명령을 만나면, 그 함수 코드 내부로 따라 들어감) 
 Step Over  F8  하나의 OP code 실행(CALL 명령을 만나면, 따라 들어가지 않고 그냥 함수 자체를 실행) 
 Execute till Return  Ctrl+F9  함수 코드 내에서 RETN 명령까지 실행(함수 탈출 목적)

EP 코드의 00D811A1 주소에서 Step Into[F7] 명령어를 사용하여 00D8284C 함수 내부로 따라갈 수 있다. 

그림 2.3 A6160000 함수 내부

  • comment의 빨간색 부분 : 코드에서 호출되는 API 함수 이름
  • D828E1 주소의 RETN 명령어 : 함수의 끝에서 사용되며 이 함수가 호출된 원래 주소로 돌아간다.
  • 위 캡쳐의 API 함수들은 Visual c++에서 프로그램 실행을 위해 추가시킨(우리 소스코드에는 없는) Visual C++ stub Code 이다. ➜ main()함수가 아니므로 우리의 목표인 main()함수를 찾아 계속 진행하겠다.

① RETN 명령어까지 Step over[F8] 하거나 Execure till Return[Ctrl+F9] 명령으로 한 방에 이동 

② RETN 명령어를 실행[F7/F8] 하면 그림 2.2의 00D811A6 주소로 오게 된다. 

 

2.4 D8104F 점프문 따라가기  

00D811A6 주소의 00D8104F 명령을 실행해서 D8104F 주소로 간다.

그림 2.4 D8104F 주소 코드의 일부분

이 코드 역시 Visual C++ Stub Code이며, 코드를 따라가다보면 우리의 목표인 main() 함수를 만날 수 있다. 

📌 초보자는 사용자 코드인지 Stub Code인지 알아보기 어렵기 때문에 각종 개발도구로 생성된 파일을 많이 접해보면 향후 이런 부분은 빨리 건너뛸 수 있다. 

 

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

3.1 베이스캠프 

베이스캠프란 디버깅을 진행하면서 중간중간 코드에서 분석을 원하는 중요 포인트(주소)를 지정해 놓은 후 그 포인트로 빠르게 갈 수 있는 방법을 잘 기록해 놓는 것. 

 

3.2 베이스캠프를 설치하는 4가지 방법 

1) Goto 명령 

베이스캠프 주소를 잘 기억해 두었다가 Go to[Ctrl+G] 명령으로 원하는 곳으로 갈 수 있다. 

 

2) BP 설치

베이스캠프로 가는 또 다른 방법은 BP(Break Point)를 설치[F2]하고, 실행[F9]하는 것이다. (가장 많이 사용하는 방법)

빨간 지점이 BP 설치 표시

디버거는 현재 시행 위치에서부터 프로세스를 실행하다가 BP가 걸린 곳에서 멈추게 됨

메인 메뉴의 View-BreakPoint를 선택(단축키 ALT+B)하면, BreakPoint 목록이 나타난다.

BP 목록

 

3) 주석 

[;] 단축키로 주석을 달고, 이 주석을 찾아가는 방법 

프로그래밍과 마찬가지고 디버깅에서 주석은 매우 중요하다. 

마우스우측 메뉴의 Search for - User-defined comment 항목을 선택하면, 사용자가 입력한 주석들이 표시된다. 

User-defined comments 

빨간 글씨가 커서 위치, 검은 글씨가 찐 주석이다. 해당 주석을 더블클릭하면, 그 주소로 갈 수 있다. 

 

4) 레이블 

레이블은 원하는 주소에 특정 이름을 붙여주는 유용한 기능이다. 

그냥 주소에 레이블을 붙이게 되면 매우 직관적으로 변경되어 디버깅할 때 매우 편함. 

 

4. 원하는 코드를 빨리 찾아내는 4가지 방법 

실행 파일의 EP 주소에 바로 main() 함수가 나타나는 것이 아니로 개발 도구(Visual C++)의 Stub COde가 나타나는 것을 알았다. 

main() 함수는 EP 코드에서 한참 떨어져 있고 이 함수를 바로 찾아갈 수 있다면 디버깅에 큰 도움이 될 것이다. 

 

4.1 코드 실행 방법 

우리가 원하는 코드 = main() 함수의 MessageBox() 함수 호출 코드 

 


Reference

🔗 http://www.yes24.com/Product/Goods/7529742

저작자표시 (새창열림)

'Security > Reversing' 카테고리의 다른 글

[Reversing] 05. 스택  (0) 2021.11.26
[Reversing] 04. IA-32 Register 기본 설명  (0) 2021.11.25
[Reversing] 03. 리틀 엔디언 표기법  (0) 2021.11.25
[Reversing] OllyDbg 기초 사용법  (0) 2021.11.25
[Reversing] 01장. 리버싱 스토리  (0) 2021.11.21
    'Security/Reversing' 카테고리의 다른 글
    • [Reversing] 04. IA-32 Register 기본 설명
    • [Reversing] 03. 리틀 엔디언 표기법
    • [Reversing] OllyDbg 기초 사용법
    • [Reversing] 01장. 리버싱 스토리
    cho2cee
    cho2cee
    Today I Learned

    티스토리툴바