레지스터 : CPU의 변수
범용 레지스터
- 8 bit Register : AH, AL
- 16bit Register : AX
- 32bit Register : EAX
- 64bit Register : RAX
- 범위 레지스터: CPU에서 사용하는 변수의 일종
- EAX
산술 계산을 하며 리턴값을 전달합니다.
가장 많이 사용하는 변수 입니다.
- EDX
큰 수의 곱셈 또는 나눗셈 연산
- ECX
C : Counter 이다.
반복문에서의 카운터 for문의 i++의 역할이지만 반복문을 돌만큼 값을 저장한 후 감소하는 형태로만 작동합니다.
- EBX
EAX, EDX, ECX와 같은 일정의 변수
- ESI
문자열이나 각종 반복 데이터를 처리 또는 메모리 옮기는 데 사용합니다.
- EDI
일종의 변수
ESI는 시작지 인덱스, EDI는 목적지 인덱스
필수로 알아야 할것
스택을 알아야합니다.
- ESP : stack pointer
stack frame의 끝 지점 주소가 담긴 포인터
- EBP : base pointer
stack frame의 첫 시작 주소가 담긴 포인터
- EIP : instruction pointer
다음에 실행해야 할 명령어의 주소 포인터
endian(엔디언)
endian(엔디언)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법에 바이트 순서라 합니다.
엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-endian)과 작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌 수 있으며, 두 경우에 속하지 않거나 둘을 모두 지원하는 것을 미들 엔디언(Middle-endian)이라 부르기도 합니다.
operand type
offset: 특정 메모리 주소를 잠조할 때는 대괄호를 사용합니다.
eax에서 +4만큼 떨어져 있는 메모리 주소를 표기 : [eax+4]
mov a, b : a에 b를 넣어라.(a =b)
mov [ecx],eax : *ecx = eax
add a, b: a를 b만큼 증가시킴(a+=b)
sub a, b: a를 b만큼 감소시킴(a-=b)
mul a : eax(ax, ah, al)*=a
div a: eax(ax, ah,al)/=a
imul a,b : a*=b
idiv a,b : a/=b
lea a, [b] : a에 [b]를 넣어라.(a=[b]}mov와의 차이점- mov는 값을 대입- lea는 주소를 대입
push a: stack에 a를 pusy(esp -=4)
pop x: stack에 있는 값을 a로 pop함(esp+=4)
Inc a : a++
Dec a : a--neg a : -anot a : ~anop : 아무것도 하지 않는 명령어 (eip만 다음으로 증가)
and a, b : a &= b
or a, b : a |=b
xor a, b : a^=b
xor의 경우 xor eax, eax를 하면 eax를 0으로 초기화 시킨다.
shl a, b : a << b
shr a, b : a >> b
Flags
레지스터에는 상태레지스터인 flags가 존재합니다.
ZF : 이런 명령어의 연산 결과가 0일 경우 zf플래그는 1이 됨
연산 결과 == 0 -> '거짓' -> ZF : 1
연산 결과 != -> '참' -> ZF : 0
CF : 부호가 없는 연산에서 비트올림이나 비트 내림이 발생하면 CF가 1이 됨
SF : 부호가 있는 연산에서 수행한 결과가 양수일 때, 즉 최상위 비트가 0이면 SF=0 반대면 1이 됨
OF : 부호가 있는 연산에서 CF의 역할(overflow flag)
Call
call location : 함수를 호출하는 명령, func는 함수의 주소
call : push eip; jmp junc
push eip : 함수 호출 이후 복귀할 주소 push 이때의 eip를 (RET)Return address 라고 합니다.
jmp location : location으로 eip를 옮김
함수 에필로그(leave-ret)
스택 프레임을 해제하기 위한 작업
함수가 끝나면 함수를 처음 호출한 지점으로 돌아가기 위한 작업
- leave
mov esp ebp : esp를 ebp와 동일하게 맞춰줌(함수가 시작했을 때의 초기값으로 복원)
pop ebp : 원래의 ebp값으로 바꿈
- ret
pop eip call할 때 push eip를 했던 그 eip를 가져옴
jmp eip call 하기전의 eip 위치로 이동
추가 : [해킹/리버싱] - [리버싱] 스택프레임이란..?
출처
'해킹 > 리버싱' 카테고리의 다른 글
[리버싱] 스택프레임이란..? (0) | 2021.11.07 |
---|---|
[리버싱] rev-basic-4~6 write up (0) | 2021.07.14 |
[리버싱] rev-basic-0~3 write up (0) | 2021.07.14 |
[해킹] 리버싱 시작 (0) | 2021.07.10 |
[해킹] 해킹의 시작 (0) | 2021.07.10 |