InfoSec/Reversing

InfoSec/Reversing

[Reversing] IDA를 사용한 HelloWorld.exe 분석

정적 분석은 주로 main 함수를 찾고 분석하므로서 시작됨 함수를 찾는 방법은 크게 진입점(EntryPoint, EP)를 찾아 분석 대상 함수의 특성이나 외적 정보 분석 이 두 가지 정도가 있는데, 보통 진입점과 main 함수의 시작 시점이 동일하지 않기 때문에 진입점을 찾아 그 지점부터 분석하는 것 보다는 main 함수의 특성이나 외적 정보를 이용하여 찾음 1. 문자열 찾기 정적 분석을 할 때, 가장 많이 사용되는 정보는 "문자열" 디버깅 메세지나 로그 파일 생성 시에 여러 문자열들이 포함됨 로그 관련 문자열에는 로그를 생성하는 함수의 이름과 인자가 포함됨 shift + F12를 해서 문자열을 찾는 화면으로 이동한다 2. 상호 참조 해당 문자열이 어디서 사용됐는지 x를 눌러서 상호 참조 기능으로 해당 ..

InfoSec/Reversing

[Reversing] PE File Format

PE File Format이란? Windows 실행 파일의 구성 방식 개발자가 코드를 작성하면 개발도구(VisualStudio)의 컴파일러가 PE File Format에 맞게 실행 파일로 만들어줌 - 컴파일 과정: 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 PE File 구조 - PE Header: DOS Header, Dos stub, NT Header, Section Header로 구성 - PE Body: 섹션들로 구성 PE File Header 작은 구조체들이 모여서 만들어진 데이터 덩어리 DOS Header: DOS와 호환성을 위해서 만들어짐. 파일의 처음에 위치하고 0x40 크기를 가짐 DOS Stub: PE 파일이 MS-DOS에서 실행될 경우, 화면에 출력될 메시지와 코드가 기록되어 있음..

InfoSec/Reversing

[Reversing] 어셈블리 코드 분석

.LC0: .string "Hello World!"; .LC0 레이블에서 문자열 할당 main: push rbp mov rbp, rsp; 스택프레임 생성 mov edi, OFFSET FLAT:.LC0; LC0의 문자열 주소가 저장됨 mov eax, 0; 반환 값 초기화 call printf; print format 호출, 문자열 인수로 넘김 mov eax, 0; main 함수가 정상적으로 종료됨 pop rbp; 스택프레임 종료 ret; 종료 .LC0과 main은 레이블이라고 부른다. - 레이블: 인스트럭션이나 데이터의 위치를 표시해줌 push rbp mov rbp, rsp 를 수행하므로써 스택프레임을 생성시킨다. - esi: 복사된 데이터의 주소를 저장 - edi: 복사된 데이터의 목적지 주소(최종 도착..

InfoSec/Reversing

[Reversing] 어셈블리어 x86-64

1. x64 어셈블리어 개요 어셈블리 언어는 컴퓨터의 기계어와 치환되는 언어다. 따라서 기계어의 종류가 다양하다면 어셈블리 언어 또한 다양하게 존재한다. 필자는 ISA x64를 사용하기 때문에 x64 어셈블리어를 배울 예정이다. 2. 어셈블리어 구조 어셈블리어는 opcode(명령어)와 operand(피연산자)로 이루어져있다. opcode operand1 operand2 mov eax 3 명령어는 이런 종류가 올 수 있고, 명령어 데이터 이동 mov, lea 산술 연산 inc, dec, add, sub 논리 연산 and, or, xor, not 비교 cmp, test 분기 jmp, je, jg 스택 push, pop 프로시져 call, ret, leave 시스템 콜 syscall 피연산자에는 세 종류가 올..

InfoSec/Reversing

[Reversing] 스택 프레임

1. 스택 프레임이란? 함수가 호출될 때에도 스택의 원리를 사용하게 됩니다. 예를 들어 아래와 같은 프로그램이 있다고 칩시다. int main() { func1(); } void func1() { func2(); } void func2() { } 그러면 스택에는 이런 식으로 함수들이 쌓이게 되겠죠. step1 step2 step3 main() func1() func2() main() func1() main() 이렇게 스택 영역에 차례대로 저장되는 각각의 함수 호출 정보를 스택 프레임 이라고 합니다. 예를 들자면 step 3에서는 스택 프레임 3개가 존재하게 되는 것입니다. 스택 프레임들도 마찬가지로 호출된 후 모든 프로그램 수행을 마치면 스택에서 삭제되겠죠? step4 step5 step6 func1()..

InfoSec/Reversing

[Reversing] 레지스터

1. 레지스터란? CPU 내부에 위치한 일시적인 메모리 공간이다. 외부 저장소도 있는데 굳이 CPU 내부에 왜 필요할까? CPU가 명령을 수행할 때 외부 저장소까지 접근하려면 시스템 버스와 접속하기 위해 너무 오랜 시간이 걸리기 때문에, 빠른 접근을 위해 CPU 내에 레지스터라는 기억장치를 사용한다. 하지만, CPU는 작기 때문에 내부에 포함할 수 있는 레지스터들의 수가 제한될 수 밖에 없다. 2. CPU의 내부 레지스터의 종류 PC (Program Counter) 다음에 인출할 명령어의 주소를 가지고 있는 레지스터 명령어 인출 후에는 자동으로 주소를 증가시킴 분기 명령어가 실행되면 목적지 주소로 갱신 AC (Accumulator) 데이터를 일시적으로 저장하는 레지스터 CPU가 한 번에 처리할 수 있는 ..

InfoSec/Reversing

[Reverisng] 스택

스택이란? 영어 Stack의 의미인 쌓다의 말 그대로 데이터를 밑에서부터 위로 차곡 차곡 쌓아 올리는 자료구조를 뜻합니다. 쉽게 설명하자면, 한번에 블럭 한 개만 넣을 수 있는 기다란 통이 있다고 가정해봅시다. 그러면 블럭을 추가 할 수록 제일 먼저 넣은 블록은 가장 바닥 쪽에 위치하게 되겠죠? 또한 블럭을 꺼내고 싶다면 가장 위에 있는 블럭부터 꺼낼 수 있겠죠? 그래서 스택의 가장 큰 특징은 가장 나중에 넣은 데이터를 가장 먼저 꺼낼 수 있다는 의미의 '후입선출(LIFO)' 입니다. 스택을 관리하기 위해 필요한 연산 그럼 이러한 자료구조를 구성한다면 어떤 연산이 필요할까요? 자료를 넣는 연산인 push()와 자료를 꺼내는 연산인 pop() 가장 최근 자료를 엿보는 peek() 등의 연산이 필요하게 됩니..

InfoSec/Reversing

[Reversing] Binary & Analysis

리버싱(리버스 엔지니어링)이란? 완성된 제품을 해체하고 분석하여 구조와 기능, 디자인을 파악하는 행위입니다. 대부분의 공학 분야에는 리버싱이 있습니다. 필자가 배우게 될 리버싱은 컴퓨터 공학의 SW 리버싱입니다. 리버싱이 사용되는 이유 좋은 예시👍 나쁜 예시👎 - 오랫동안 개발 중단된 프로그램을 패치해야 할 때 - 각종 프로그램의 보안성을 평가할 때 - 악성코드를 분석할 때 - 상용 프로그램 무료로 이용하기 위해 불법 프로그램을 만들 때 - 게임의 핵을 만들 때 하지만 리버싱을 하면서 프로그램의 전체적인 작동 원리를 알아낼 수 있으므로, 상용 프로그램의 지적 재산권을 침해할 수 있습니다. 따라서 리버싱은 저작권을 침해하지 않는 선에서 제한적으로 허용됩니다. Binary 자연어 -- 어셈블리어 --어셈블러..

agor
'InfoSec/Reversing' 카테고리의 글 목록