pwnable.tw start

Posted by dw0rdptr
2017. 8. 27. 14:45 Study/Reversing&System Hacking


0x8048087 mov ecx, esp에서 스택주소를 leak할 수 있다.

그리고 그 leak한 주소에서 쉘코드까지 거리를 계산해 ret에서 쉘코드로 점프하게 만들면 끝



'Study > Reversing&System Hacking' 카테고리의 다른 글

1부 05~07장  (0) 2015.03.16
1부 01~04장  (0) 2015.03.16

1부 05~07장

Posted by dw0rdptr
2015. 3. 16. 17:48 Study/Reversing&System Hacking

05장 - 스택

프로세스에서 스택 메모리의 역할

1) 함수 내의 로컬 변수 임시 저장

2) 함수 호출 시 파라미터 전달

3) 복귀 주소(retrun address) 저장


스택의 특징


&스택 구조

프로세스에서 스택 포인터(ESP)의 초기값은 Stack Bottom쪽에 가깝다. PUSH 명령에 의해서 Stack에 값이 추가되면 ESP는 Stack Top을 향해 움직인다 . POP 명령에 의해 스택에서 값이 제거되면 스택 포인터는 Stack Bottom을 향해 줄어든다.

* 실제 메모리상에서는 높은주소에서 낮은주소로 스택이 자람 즉, Stack Bottom이 메모리상의 높은 주소, Stack Top이 메모리상의 낮은 주소


06장 - abex' crackme #1 분석


명령어

 설명

 PUSH

 스택에 값을 입력

 INC

 값을 1 증가

 DEC

 값을 1 감소

 JMP

 지정된 주소로 점프

 CMP

 주어진 두개의 operand 비교        * SUB 명령어와 동일하나 operand값이 변경되지 않고  EFLAGS 레지스터만 변경됨 (두 operand의 값이 동일하다면 SUB 결과는 0, ZF=1)

 JE

 조건 분기(Jump if equal)    * ZF = 1이면 점프

 CALL

 지정된 주소의 함수를 호출


스택에 파라미터를 전달하는 방법

함수를 호출하기 전에 PUSH 명령어를 사용하여 파라미터를 입력할 때 역순으로 입력하는데, 이는 스택이 FILO(First In Last Out) 구조이기 때문에 파라미터를 역순으로 넣어주면 받는 함수에서 올바른 순서로 꺼낼 수있다.


07장 - 스택 프레임

스택 프레임

EBP 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법을 말한다. 어떤 기준 시점(함수 시작)의 ESP값을 EBP에저장하고 이를 함수 내에서 유지해주면 ESP 값이 변하더라도 EBP를 기준으로 안전하게 해당 함수의 변수, 파라미터, 복귀 주소에 접근 할 수 있다.



'Study > Reversing&System Hacking' 카테고리의 다른 글

pwnable.tw start  (0) 2017.08.27
1부 01~04장  (0) 2015.03.16

1부 01~04장

Posted by dw0rdptr
2015. 3. 16. 02:44 Study/Reversing&System Hacking

01장 - 리버싱 스토리

리버스 엔지니어링? : 물건이나 기계장치 혹은 시스템 등의 구조,기능,동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업. 소프트웨어 분야의 리버스 엔지니어링은 보통 리버스 코드 엔지니어링이라고 한다.


분석방법

1) 정적분석

파일의 겉모습을 관찰하여 분석하는 방법이다. 파일을 실행하지 않고 파일의 종류,크기,헤더 그외의 다양한 정보를 확인하는 것이다.

2) 동적분석

파일을 직접 실행시켜 분석하고 디버깅을 통하여 흐름과 메모리 상태를 자세히 살펴보는방법. 프로그램 내부 구조와 동작원리를 분석할 수 있다.



02장 - Hello World! 리버싱


OllyDbg 사용법

명령어

  단축키

 설명

 Restart 

 [Ctrl+F2]

 다시 처음부터 디버깅 시작

 Step into

 [F7]

 하나의 옵코드 실행(CALL 명령을 만나면 그 함수 코드 내부로 따라들어감)

 Step Over

 [F8]

 하나의 옵코드실행(CALL 명령을 만나도 내부로 따라들어가지 않고 실행)

 Execute till Return

 [Ctrl+F9]

 함수 코드 내에서 RETN 명령어까지 실행(함수 탈출목적)

 Go to  

 [Ctrl+G]

 원하는 주소로 이동(코드,메모리를 확인할 때 사용. 실행되는것은 아님)

 Execute till Cursor

 [F4] 

 cursor 위치까지 실행(디버깅하고 싶은 주소까지 바로 갈 수 있음)

 Comment

  :

 Comment 추가

 Label

  : 

 Label 추가

 Set/Reset BreakPoint [F2] BP 설정/해제

 Run

 [F9]

 실행(BP가 걸려있으면 그곳에서 실행이 정지)

 Show the current EIP

 *

 현재 EIP 위치를 보여줌

 Show the previous Cursor

 - 직전 커서 위치를 다시 보여줌

 Preview CALL/JMP address

 [Enter]

 커서가 CALL/JMP 명령어에 위치해 있다면 해당 주소를 따라가서 보여줌(실행x)

                      

* EP(Entry Point)

EP란 Windows 실행파일(EXE,DLL,SYS 등) 의 코드 시작점을 의미한다. 프로그램이 실행될 때 CPU에 의해 가장 먼저 실행되는 코드 시작위치라고 생각하면 된다.

                          

베이스캠프 설치

디버거를 재실행할 때마다 처음부터 새로 시작하기 때문에 중간중간 중요 포인트(주소)를 지정해 그 포인트로 빠르게 갈 수 있는 방법을 기록해두면 디버깅을 재실행할 때 이전에 지정한 포인트들을 거치면서 목표 지점까지 빠르게 도달 할 수 있다.

Goto 명령을 이용한 베이스 캠프 설치, BP 설치, 주석, 레이블로 베이스캠프를 설치하고 이동할 수 있다.



디버깅을 수행할 때 분석을 원하는 코드를 빨리 찾아내는 방법으로는 

- 명령어를 하나하나 실행하면서 원하는 위치를 찾아가는 것 (코드의 크기가 작고 기능이 명확한 경우에 사용가능)

- 문자열 검색 방법(OllyDbg는 디버깅할 프로그램을 처음 로딩할 때 사전 분석 과정을 거치면서 참조되는 문자열과 호출되는 API들을 따로 목록으로 정리해놓음)

- API 검색 - 호출 코드에 BP

- API 검색 - API 코드에 직접 BP


패치

패치는 리버싱에서 빼놓을 수 없는 중요한 주제이다. 패치 기술을 이용하여 기존 응용 프로그램의 버그를 수정하거나 또는 새로운 기능을 추가시킬 수도 있다. 패치 대상으로는 파일 혹은 메모리가 될 수 있으며 프로그램의 코드,데이터 모두 패치가능하다.


문자열을 패치하는 방법

1) 문자열 버퍼를 직접 수정

2) 다른 메모리 영역에 새로운 문자열을 생성하여 전달



03장 - 리틀 엔디언 표기법


바이트 오더링

바이트 오더링은 데이터를 저장하는 방식이라고 생각하면되는데 바이트오더링 방식에는 크게 두 가지가 있다.


DWORD dw = 0xdeadbeef;

빅 엔디언(Big Endian)

데이터 저장방식 :[de][ad][be][ef]  -> 사람이 보기에 직관적. 대형 UNIX 서버에 사용되는 RISC 계열 CPU와 네트워크 프로토콜에서 많이 사용됨


리틀 엔디언(Little Endian) 

데이터 저장방식 : [ef][be][ad][de] -> 데이터를 역순으로 저장. Intel x86 CPU 에서 사용함. 산술연산과 데이터의 타입 확장/축소될 때 효율적



04장 - IA-32 Register 기본 설명



cpu레지스터란?

Register : cpu 내부-에 존재하는 다목적 저장공간 고속으로 데이터 처리 가능


Basic progrma execution registers

- General Purpose Registers(32bit -8개)

- Segment Registers(16bit - 6개)

- Program Status and Control Register(32bit - 1개)

- Instruction Pointer(32bit - 1개)


*레지스터 이름에 E(Etended)가 붙은 경우는 16비트 CPU부터 존재하던 16비트 레지스터를 32비트로 확장함을 의미


General Purpose Registers

General Purpose Registers(범용레지스터)에 관한 설명은 다음 링크에 있다.

파이썬 해킹 프로그래밍-디버거(레지스터와 스택)


EBP, ESI, EDI, ESP는 주로 메모리 주소를 저장한다

PUSH, POP, CALL, RET 명령어는 ESP를 직접 조작하기도 함

EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가 함수가 리턴하기 직전에 다시 ESP에 값을 돌려주어 스택을 유지한다(Stack Frame 기법)

EDI,ESI는 주로 메모리 복사에 사용된다

각 레지스터들은 16비트 하위 호환을 위해 몇 개의 구획으로 나뉘어짐.

EAX : (0~31) 32bit

AX : (0~15) 16bit

AH : (8~15) 상위 8bit

AL : (0~7) 하위 8bit


세그먼트 레지스터

세그먼트(Segment)란?

- IA-32 보호 모드에서 메모리를 조각내 조각마다 시작주소, 범위, 접근권한 등을 부여해 메모리를 보호하는 기법

- 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용됨

- 세그먼트 메모리는 Segment Descriptor Table(SDT)에 기술되어 있는데 세그먼트레지스터는 이 SDT의 index를 가지고 있음


보호모드에서의 세그먼트 메모리 모델(IA-32에서 발췌)

-각 세그먼트 레지스터가 가리키는 세그먼트 디스크립터(Segment Descriptor)와 가상 메모리가 조합되어 선형주소가 되며 페이징기법에 의해 선형주소가 최종적으로 물리주소로 변환됨

* OS에서 페이징을 사용하지 않는다면 선형주소는 그대로 물리주소가 됨


세그먼트 레지스터의 종류

CS : Code Segment

SS : Stack Segment

DS : Data Segment

ES : Extra(Data) Segment

FS : Data Segment   -> SEH,TEB,PEB 등의 주소를 계산할 때 사용됨(고급 디버깅)

GS : Data Segment



프로그램 상태, 컨트롤 레지스터

EFLAGS : Flag Register                      * Flag? : 단어 그대로 깃발이 올라가면 1(ON/True) 내려가면 0(OFF/False)

EFLAGS는 16비트 FLAGS 레지스터의 확장형으로 32비트이며 각각의 비트마다 의미를 가지고 있다.

일부 비트는 시스템에서 직접 세팅하고, 일부 비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅된다.


EFLAGS Register

리버싱 입문 단계에서는 세가지 flag(ZF,OF,CF)에 대해서만 이해하면 된다. 조건 분기 명령어에서 이들 Flag의 값을 확인하고 그에 따라 동작 수행 여부를 결정하기 때문이다.

ZF(Zero Flag) : 연산 명령 후에 결과 값이 0이 되면 ZF가 1(True)로 세팅됨

OF(Overflow Flag) : 부호있는수(signed integer)의 오버플로가 발생했을 때,MSB(Most Significant Bit)가 변경되었을 때 1로 세팅

CF(Carry Flag) : 부호없는수(unsigned integer)의 오버플로가 발생했을 때 1로 세팅


Instruction Pointer

EIP : Instruction pointer

Instruction Pointer는 CPU가 처리할 명령어의 주소를 나타내는 레지스터이며 32bit이다.(16bit IP 레지스터의 확장) CPU는 EIP에 저장된 메모리 주소의 명령어(instruction)를 하나 처리하고 자동으로 그 명령어 길이만큼 EIP 증가

* 범용 레지스터와는 다르게 EIP는 직접 값을 변경할 수 없음

  특정 명령어(JMP,Jcc,CALL,RET)를 사용하거나 인터럽트, 예외를 발생시켜 간접적으로 변경

'Study > Reversing&System Hacking' 카테고리의 다른 글

pwnable.tw start  (0) 2017.08.27
1부 05~07장  (0) 2015.03.16