-
16진수
0 1 2 3 4 5 6 7 8 9 A B C D E F
0x9 + 0x1 = 0xA
0xF + 0x1 = 0x10
0x6032a0 + 0x10 = 0x6032b0
0x6032ff + 0x1 = 0x603300
데이터 타입
1byte = 8bit
WORD = 2-byte data item
DWORD = 4-byte data item (32bit)
QWORD = 8-byte data item (64bit)
"ABCD"
낮은 주소 0x41 0x42 0x43 0x44 높은 주소 "ABCD" = “\x41\x42\x43\x44”
pwndbg는 높은주소에서 낮은주소 순으로 보여줌
Stack의 메모리 상태 볼 수 있음
디버거로 위의 문자열이 저장된 메모리를 보면 0x44434241 로 저장됨
리틀엔디안방식
0x41424344 주소를 저장하고 싶으면 “DCBA”
0x44434241 주소를 저장하고 싶으면 “ABCD”
레지스터
Data register
- 32bit
가장 큰 레지스터 앞에 E가 붙음
- 64bit
가장 큰 레지스터 앞에 R이 붙음
Ex) EAX, EBX, ECX, EDX / RAX, RBX, RCX, RDX
Pointer register
- Instruction Pointer (IP)
실행할 명령어의 주소를 가짐
- Stack Pointer (SP)
스택의 어느 주소를 가리키면서 push 와 pop 명령어를 수행
- Base Pointer (BP)
push ebp : 함수의 가장 첫번째 명령어
ebp 위의 스택 공간에서 명령 수행
ESP EBP Index register
- Source Index (SI)
문자열/배열의 소스를 지정하기 위해 사용됨
- Destination Index (DI)
문자열/배열의 목적지를 지정하기 위해 사용됨
함수 인자
- 32bit 인자 순서
push 로 스택에 집어넣고 호출
- 64bit 인자 순서
RDI, RSI, RDX, …
read(fd, buf, n); => read(RDI, RSI, RDX);
n : 최대 바이트 수
buf (버퍼) : 입력한 값이 저장되는 주소
fd (File Descriptor) :
0 표준 입력 (read 함수와 사용) 1 표준 출력 (write 함수와 사용) 2 표준 에러 어셈블리어 명령어
PTR
: 데이터 타입을 재정의하는 명령어
Ex) qword ptr : 8바이트 타입으로 재정의
MOV
: 복사
mov 에서는 사칙연산 불가능
[ ] 를 통해 주소를 참조
Ex) mov rax, rbp
sub rax, 16
LEA
: 주소 복사
Ex) lea rax, rbp - 16
PUSH
: 스택에 데이터 삽입 ( - 연산)
POP
: 스택에서 가장 위의 데이터 제거 ( + 연산)
CMP : 조건문
: 비교 명령 ( - 연산 수행)
어셈블리 프로그램
- data section : 런타임 동안 이 섹션에 선언된 데이터는 변하지 않음 Ex) 상수, 파일 이름 등
- bss section : 변수
- text section : 코드
'Hacking > Pwnable' 카테고리의 다른 글
1주차 리눅스 환경 구축 (0) 2021.03.31 댓글