<해킹: 공격의 예술> 책을 보고 공부한 내용입니다
X86 프로세서를 기준으로 합니다.
GDB 조사 명령 형식
o : 8진법
x : 16진법
u : 부호가 없는 표준 10진법
t : 2진법
메모리 단일 유닛의 기본 크기는 '워드' 라 불리는 4 byte (32bit 환경에서)
b 단일 바이트
h 2byte의 하프워드
w 4byte의 워드
g 8byte의 자이언트
eip 레지스터 : 프로세서가 읽고 있는 현재 명령의 위치를 가리키는 명령 포인터 레지스터
i r eip : eip 레지스터의 현재 메모리 주소
x/x $eip : 16진법으로 eip가 갖고 있는 값 출력 ($eip는 그 순간 eip가 갖고 있는 값을 의미한다.)
x/xw $eip : 16진법으로 4byte만큼 출력 ( 리틀엔디안 x )
x/i $eip : eip 위치의 역어셈블된 어셈블리 언어의 명령 메모리 확인 ex) x/4i 이면 4줄 조사
x/6xb 0x8048484 : 메모리 주소에 들어있는 값 16진수 바이트 단위로 6 byte 조사 ( 리틀엔디안 )
문자열
- 문자 배열
- 배열의 마지막은 널 바이트로 저장 ( 문자열을 처리할 때 여기서 중단하라고 알리기 위함)
Signed , Unsigned
unsigned : 부호 없이 선언
signed : 부호 존재
포인터
- x86 아키텍처의 메모리는 32bit 주소를 사용하므로 포인터의 크기는 32bit(4byte)이다.
Ex)
int int_var = 5;
int *int_ptr; # 포인터
int_ptr = &int_var; # int_var의 주소를 int_ptr에 넣는다.
/**
int_ptr = 0xbffff834 # int_var의 위치
&int_ptr = 0xbffff830 # int_ptr의 위치
*int_ptr = 0x00000005 # int_var의 값
int_ptr에는 int_var의 위치 주소 값이 들어있으며 가리키는 값은 int_var의 값이다.
**/
형식 문자열
%d , %u, %x -> 포인터가 아닌 값 자체를 받아들인다.
%s, %n -> 포인터를 받아들인다.
- %s 형식 인자는 주어진 메모리 주소에서부터 시작해 널 바이트가 나올 때까지 메모리에 있는 데이터를 출력한다.
- %n 형식 인자는 지금까지 출력한 바이트의 수를 주어진 메모리 주소에 쓴다.
scanf가 printf와 다른 점? 모든 인자가 포인터여야 한다. (인자가 변수 자체가 아니라 변수 주소여야 한다는 의미!!)
형 변환
char char_array[5] = {'a','b','c','d','e'}
int int_array[5] = {1,2,3,4,5}
char *char_pointer;
int *int_pointer;
# 타입을 제대로 맞춰주어야함
char_pointer = char_array;
int_pointer = int_array;
# 포인터 이동
# 1->2
int_pointer = int_pointer + 1; # 정수 타입이므로 4byte 이동
# a->b
char_pointer = char_pointer + 1; # char 타입이므로 1byte 이동
char char_array[5] = {'a','b','c','d','e'}
int int_array[5] = {1,2,3,4,5}
# 타입이 없는 포인터를 사용 후 형 변환을 해주는 것도 가능
void *void_pointer;
void_pointer = (void *) char_array;
# 포인터가 가리키는 값 바꾸고 싶은 경우
void_pointer = (void *)((char *) void_pointer + 1);
C의 변수에 대해 기억해야 할 중요한 점은, 컴파일러는 변수 타입에만 관심이 있다는 점
프로그램을 컴파일하고 나면 변수는 메모리 주소일 뿐이다.
어떤 타입의 변수도 컴파일러가 원하는 타입으로 강제적으로 형 변환할 수 있다.
'Hacking > System Hacking' 카테고리의 다른 글
| <해킹: 공격의 예술> 3회차 스터디 (0) | 2022.05.01 |
|---|---|
| <해킹: 공격의 예술> 2회차 스터디 (0) | 2022.04.28 |
| [dreamhack] Return to Library (0) | 2022.04.10 |
| [dreamhack] ssp_001 문제풀이 (0) | 2022.04.04 |
| 카나리 우회기법 (0) | 2022.04.02 |