Tiny Bunny

동아리/팀 스터디

[8기 기초] 리버싱 팀 02

bento 2023. 9. 29. 03:17

활용 강의

유튜브 - Fin

 

리버싱 분석 방법

정적 분석: 파일을 실행하지 않고 분석 -  파일의 겉모습만을 분석 ex) IDA

동적 분석: 파일을 실행하여 분석 - 파일의 내부로 진입하여 분석 ex) cheat engine, Ollydbg, x64dbg, IDA

 

어셈블리어 

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

패치와 크랙

패치: 프로그램의 메모리를 변경하는 것

크랙: 패치와 비슷한 개념이나, 불법적인 경우


gdb 사용법 

 

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

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

 

x64dbg 메인 창

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

x64dbg 단축키

Ctrl+F2 처음부터 디버깅 시작
F7 하나의 OP code 실행(내부로 들어감)
F8 하나의 OP code 실행
Ctrl+F9 RETN 명령어까지 실행(함수 탈출 목적)

 


Hello World 분석하기 

- 어셈블리어로 main 함수를 찾아보고 디버거 사용방법과 명령어 익히기

 

MessageBox를 호출하는 함수나 HelloWorld 문자열을 출력하는 부분을 찾으면 되겠다.

main 함수


바이트 오더링(Byte Ordering)

: 컴퓨터에서 메모리에 데이터를 저장하는 방식

 

1. 빅 엔디안(Big Endian)

: 모든 데이터를 순서대로 저장, 직관적

 

2. 리틀 엔디안(Little Endian)

: 멀티바이트만 역순으로 저장(가장 낮은 바이트부터 정렬), intel에서 사용하며 데이터 저장이 효율적이다

      빅엔디안 리틀엔디안
 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]


리틀엔디안 방식을 직접 확인해보기

 

실행파일 코드

더보기
//실행파일 코드

#include <windows.h>
#include <stdio.h>
//Intel x84 CPU 리틀엔디언 저장방식을 사용한다.
//이 프로그램도 리틀엔디언이다. 

BYTE a = 0x12;
WORD b = 0x1234;
DWORD ab = 0x12345678;
char str[] = "abcde";

int main() 
{
	BYTE lb = a;
	WORD lw = b;
	DWORD lwd = ab;
	char* lstr = str;

	printf("리틀엔디언 저장방식");
	return 0;
}

 

main 함수
리틀엔디안 형식으로 들어간 부분을 확인 가능


레지스터

 

CPU 레지스터

: CPU 내부에 있는 저장 공간 > 데이터 연산속도가 매우 빠름

 

Basic Program Execution Registers (BPER)

• 범용 레지스터(General Register) 32비트 8개

 

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

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

 

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

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

 

• 명령어 포인터 레지스터(Instruction Pointer Register, IP)

EIP CPU가 처리할 명령어 주소

 

• 플래그 레지스터(Flag Register)

: 명령어 수행에 따라 True(1), false(0)로 세팅되면 총 32개가 있다.

 

OF(Overflow Flag) 부호가 있는 수(signed integer > - 부호가 있다는 것을 의미)의 오버 플로우가 발생했을 때, MSB(최상위 비트)가 변경됐을 때 1로 세팅된다. 
CF(Carry Flag) 부호가 없는 수(unsigned integer)의 오버플로우가 발생했을 때 1로 세팅된다. 
ZF(Zero Flag) 연산 결과 값이 0이면 1로 세팅된다.

ex. ZF

move eax, 1                     ZF = 1
move ebx, 1
sub eax, ebx
r = 0
728x90

'동아리 > 팀 스터디' 카테고리의 다른 글

[8기 기초] 리버싱 팀 06  (0) 2023.11.10
[8기 기초] 리버싱 팀 05  (0) 2023.11.10
[8기 기초] 리버싱 팀 04  (0) 2023.10.14
[8기 기초] 리버싱 팀 03  (0) 2023.10.11
[8기 기초] 리버싱 팀 01  (0) 2023.09.28