본문 바로가기
8. 정보보안 노트 정리

GDB, 레지스터 등 정리

by Robert8478 2023. 12. 11.

[범용 레지스터]

EAX - 누산기 레지스터

ECX - 카운터 레지스터

EDX - 데이터 레지스터

DBX - 베이스 레지스터

ESP - 스택 포인터

EBP - 베이스 포인터

ESI - 근원지 인덱스

EDI - 목적지 인덱스


*주요 레지스터

EIP(Instruction Pointer) - 현재 읽고있는 명령의 위치를 가리키는 명령으로 읽고 있는 각 단어를 손가락으로 짚으며 읽듯이

프로세서가 EIP 레지스터라는 손가락을 사용해 읽는것과 같다.

EFLAGS 레지스터 - 메모리 세그먼트를 관리하는 레지스터


[어셈블리 언어]

set disas intel 명령어로 intel 문법을 사용하며 .gdbinit 파일에 등록하여 유지 가능

(인텔 문법 어셈블리 명령 형식)

명령 <목적지> <근원지>

ex) mov ebp, esp = 값을 esp에서 ebp로 이동시킨다.

sub esp, 0x8 = esp에서 8을 뺀 결과를 esp에 저장한다.

cmp DWORD PTR [ebp-4], 0x9 = ebp 4바이트 주소값에서 4만큼 뺀 주소의 값과 9를 비교한다. (DWORD는 4바이트 값을 의미)

jle <main1>

jmp <main2> = 위에서 비교 후 jle는 비교 결과값이 작거나 같으면 main1으로 점프, 그렇지 않으면 main2로 점프한다.



[GDB]

i r eip (info register) = 해당 명령어로 해당 레지스터의 정보를 확인할 수 있다.


examine 명령어인 x를 사용하여 메모리를 조사할 수 있으며 표현 형식(o,x,u,t)과 같이 사용한다.

x/o 0x11111111 = 8진법으로 해당 메모리 주소 조사

x/x $eip = 16진법으로 eip 메모리 주소 조사, x/u는 부호가 없는 10진법, x/t는 2진법으로 보여준다.

x/i $eip = 역어셈블된 어셈블리 언어의 명령 메모리를 보여준다. 평문같이 보여준다는 뜻 (ex: DWORD PTR [ebp-4],0x0)


표현 형식 앞에 숫자가 붙으면 목표 주소에서 여러 개를 조사하는 형식으로 사용된다.

x/12x $eip = 16진법으로 eip 메모리 주소를 조사하며 해당 주소부터 12 항목의 메모리 주소를 확인한다. -> 0x0011111 0x00111222 

0x00111333 ... 0x00111212


표현형식 뒤에 크기 문자를 설정하여 바이트 크기를 변경하여 출력할 수 있다.

b - 단일 바이트, h - 2바이트의 하프워드, w - 4바이트의 워드 g - 8바이트의 자이언트

0xc4c5c6c7 ->   x/xb -> 0xc7 0xc6 0xc5 0xc4   ,   x/xh -> 0xc6c7 0xc4c5   ,   x/xw -> 0xc4c5c6c7  (거꾸로 적히는 이유는 리틀 엔디안 방식이기 때문)

nexti - 현재 명령을 실행해준다. 즉, EIP의 명령을 읽는다

list - 프로그램의 소스 코드를 출력한다.

break - 프로그램의 실행 멈춤 포인트를 설정한다. *(주소)로 설정하거나 main 혹은 함수명(strcpy)로 설정하거나 list에서 확인 가능한 코드 라인의 넘버 (break 7)와 같이 설정한다.

bt - 스택을 되돌아보는데 사용한다. 즉, 스택에 쌓인 명령을 확인할 수 있다.