본문 바로가기

2. Reversing (리버싱)

[2023.09.30] 리버싱 2주차 팀활동

이번 주차는 유튜트 강의를 활용하여 리버싱에 대한 기초 지식을 알아갔다.

1~4강을 듣고 각자의 필기 내용과 질문을 공유하는 시간을 가졌다.

https://youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO&si=dw319z0VSZfxiXHy 

 

리버싱 강의

리버싱에 대해 공부합시다.

www.youtube.com

 

 

리버싱이란?

 

공학의 반대 -> 역공학

 

ex) 스마트폰

     <공학> 정방향

     설계도 -> 재료 -> 만들기 -> 제품

     <역공학> 역방향

     제품 -> 어떤 방식으로 만들었는지 -> 재료 파악 -> 설계도 구현

 

리버싱 분석방법

1. 정적분석 : 파일을 실행하지 않고 분석하는 방법. 정적 파일의 겉모습을 분석한다. ex) IDA

2. 동적분석: 파일을 실행하지 않고 분석하는 방법. 파일 깊이 들어가서 분석 및 관찰한다. ex) cheat engine, Ollydbg,   x64dbg

 

어셈블리어

기계와 1:1 대응되는 언어

 

패치와 크랙

패치: 프로세스의 메모리를 변경하는 것

크랙: 패치와 비스하나 불법적인 경우

 

gdb 사용방법

EP (Entry Point): 파일의 시작점

BP (Break Point): 프로세스를 일시적으로 중단할 지점

 

● x64dbg 단축키

 Ctrl + F2 - 처음부터 디버깅 시작

 F7 - 하나의 OP code 실행(내부로 들어감)

 F8 - 하나의 OP code 실행

Ctrl + F9 - RETN 명령어까지 실행 (함수 탈출 목적)

SpaceBar - 코드 수정 가능

 

Hello World 분석하기

● Hello World 실행파일을 디버깅하여 어셈블리 언어로 변환하여 main 함수를 찾아보고 이 과정을 통해 기본적인 디버거의 사용 방법과 어셈블리 명령어를 알아보자

 

MassageBox를 호출하는 함수나 HelloWorld 문자열을 출력하는 부분을 찾는다.

 

바이트 오더링 (Byte Odering)

컴퓨터에서 메모리에 데이터를 저장하는 방식을 의미한다.

 

1. 빅 엔디안 (Big Endian) 

 모든 데이터를 순서대로 저장한다.

 장점: 사람이 보기에 직관적이다.

 단점: Window의 Intel 사용이 안된다. 서버용 CPU에서 사용된다.

 

2. 리틀 엔디안 (Little Endian)

 멀티바이트만 역순으로 저장한다

 장점: Window에서 사용된다. 데이터를 효율적으로 저장할 수 있다.

 단점: 사람이 보기에 어렵다.

  Name   빅엔디안 리틀엔디안
byte a 1 [12] [12]
word b 2 [12][34] [34][12]
dword ab 4 [12][34][56][78] [78][56][34][12]
char[] str 4 [12][12][12][00] [12][12][12][00]

 

● 리틀엔디안 직접 확인해보기

main 함수
리틀엔디안 방식 확인

 

CPU 레지스터

CPU 내부에 있는 저장공간을 말한다. 즉, CPU 내부에 있기에 데이터 연산속도가 매우 빠르다.

 - 범용 레지스터 (General Register) : 막 쓰는 레지스터 ?

 

● 산술 명령어에서 상수/ 변수 값이 저장되는 용도

EAX  결과값을 저장하거나 오퍼랜드를 축적
EBX  
ECX while문, for문 등 반복문을 사용할 때 loop count -1 감소
EDX  

메모리 주소를 저장하는 포인터 용도

ESI  
EDI  
EBP ESP 값을 저장
ESP 스택 메모리 주소

● 명령어 포인터 레지스터

EIP CPU가 처리할 명령어 주소

● 플래그 레지스터 - 명령어 수행에 따라 True(1), False(0)로 세팅되며 32개가 있다

Zero Flag 연산 명령 후에 결과 값이 0이 되면 1로 세팅된다.
OverFlow Flag 부호가 있는 수의 오버플로우가 발생했을 때, MSB가 변경되었을 때 1로 세팅된다.
Carry Flag 부호가 없는 수의 오버플로우가 발생했을 때 1로 세팅된다.