활용 강의
유튜브 - 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 문자열을 출력하는 부분을 찾으면 되겠다.
바이트 오더링(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;
}
레지스터
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
'동아리 > 팀 스터디' 카테고리의 다른 글
[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 |