티스토리 뷰



프로그램 제작 원리


.c -> [complie] -> .obj -> [link] -> .exe


decompiler는 .exe -> .c 해주는 프로그램이다. 완벽하게 재구성될 수 없으며, 결과가 매우 다양할 수 있다.

disassembler는 기계어 -> 어셈블리어로 변환 해주는 프로그램이다.


IA32 - 인텔 cpu 구조


크게 4가지로 나누어져 있음.


ALU : 전기적인 신호를 계산하는 회로


Register : cpu에 있는 임시 기억 공간

  • 가장 빠른 메모리 공간임


Control unit : pc가 연산할때 상태, 결과를 알 수 있음 (EIP, IR, Eflags)


I/O unit : 다른 버스들과 입출력하는 통로 역할.


*Register 에 대해 자세하게

: 범용 레지스터


EAX

  • 연산의 결과를 저장하기 위한 레지스터.

  • 연산의 결과가 2바이트면 절반인 AX를 사용.

  • 이것을 또 절반으로 쪼개면 AH, AL로 나뉘게 됨.

  • 함수의 반환값이 저장되는 용도로도 사용됨.

EBX

  • 주소 연산할 때 사용한다.

  • 많이 사용되지는 않는다.

ECX

  • 연산의 횟수를 지정해줄 때 자주 사용한다.

EDX

  • EAX의 보조역할로 많이 사용.

  • 연산의 결과가 4바이트를 넘어서면 EDX에 추가적으로 저장

  • 나누기 연산을 할 때 몫을 EAX에, 나머지를 EDX에 저장함.

ESI

  • 문자열에 관련된 레지스터

  • ESI가 저장되어 있는 문자열에 EDI가 가르키는 문자로 가라

EDI


  • 문자열에 관련된 레지스터

  • ESI가 저장되어 있는 문자열에 EDI가 가르키는 문자로 가라

EBP

  • 메모리는 Code,  Data, Heap, Stack 영역으로 분류한다.

  • EBP와 ESP는 Stack영역에서 사용되는 레지스터라고 할 수 있다.

  • EBP는 스택의 시작 주소를 가리킨다.

  • EBP는 보통 변하지 않는다.(한 함수에서 고정적이다.)

ESP

  • EBP는 스택의 맨 윗부분(높은 주소)을 가리킨다.

  • push, pop 될 때마다 ESP가 변한다.

EIP

  • CPU가 실행 할 다음 명령어가 있는 레지스터.

Eflags

  • 연산하면서 컴퓨터의 상태를 볼 수 있는 레지스터.

  • zero flag는 연산 결과의 참, 거짓을 판단



메모리 구조


Code | Data(BSS(초기화 되지 않은 변수) | Heap | Stack | kernel

<- 낮은 주소                                                                -> 높은 주소



'pwnable > 정리' 카테고리의 다른 글

gdb 사용법 정리  (0) 2018.01.06
ShellShock bash shell 취약점(CVE-2014-6271)  (0) 2018.01.01
쉘코드 모음 정리  (1) 2017.12.14
올리 디버거 기초 사용법, 명령어  (0) 2017.12.14
CPU 레지스터 정리  (0) 2017.12.14
Comments