-
Assembly BasicReversing 2019. 7. 6. 12:43
Assembly 란
프로그래밍 언어 중 하나, 기계어에서 한 단계 위의 언어
low level 언어에 속한다.
기계어는 CPU 가 채택한 ISA 에 따라 다르기 때문에 명령어 역시 통일된 규격이 없다.
문법 아키텍쳐에 따라서도 다르고 어셈블러의 종류에 따라서도 문법/매크로 등이 다르다.
MIPS / Intel / SPAC ... 에 따라 다름
OP Code
Binary code > Hex Code
Hex Code 를 조금더 알아보기 쉽게 > Assembly
Intel® Software
Check out the official source for developing on Intel hardware and software.
software.intel.com
AT&T 문법 과 Intel 문법의 차이가 있다
AT&T 의 mov > mov %rsp,%rbp > mov [dest] [source]
Intel 의 mov > mov rbp, rsp > mov [source] [dest]
Compile, Assemble
High level language > Assembly code > Object Code > Executable > Execute
compiler Assembler Linker Loader
GNU Compiler Collection ( GCC )
실습환경구성
Ubuntu 16.04.3
NASM 설치 (Intel ASM 문법) > sudo apt-get install nasm
gcc 설치 (AT&T ASM 문법) > 기본적으로 설치 되어있음
Hello world 출력하기
nasm -felf64 hello.asm; ld -o hello hello.o
자체 최적화 rax > eax 로 자동으로 바뀜, 레이블 정보 없고 주소랑 값으로 바뀐다.
Register
- 어셈블리에서 사용되는 기본 변수 이름
- 다른 언어와 달리 하드웨어적으로 구현 됨
- 이름 변경 불가능
- CPU 종류 별로 레지스터 이름이 다 다르다
- 레지스터 이름 별로 정해진 용도가 있다.
- 위의 코드에서 message 는 nasm 이 정의한 symbol 이다.
x64 Register
출처 : https://www.chegg.com/homework-help/questions-and-answers/ rbx, rcx, rdx 도 마찬가지
rsi 는 esi(32), si(16), sil(8)
r8 은 r8d(32), r8w(16), r8b(8)
edi 첫번째 인자
RBP : 현재함수의 베이스 포인터
RSP : 현재 스택 최상위를 가리킴
RIP : 다음 수행 될 코드 영역을 가리키고 있음
MIPS Register
출처 : https://www.cs.fsu.edu/~hawkes/cda3101lects/chap3/F3.13.html ARM core register in ARM state (x32, x64:요즘 핸드폰)
출처 : http://recipes.egloos.com/4986854 MOV
MOV eax, [rbp - 16] > eax = *(rbp-16)
LEA eax, [rbp - 16] > eax = (rbp-16)
> sub rbp, 16
mov eax, rbp 와 같지 않음
CMP, TEST
비교에 관련되있다.
JMP , CALL
JMP 다음의 주소로 이동
CALL : CALL 다음 명령어 주소를 스댁에 PUSH
RET : 현재 RSP 가 가리키고 있는 값으로 점프, 스택 최상위에 있는 값으로 점프
JZ, JE, JLE, JGE, JL, JG ..
조건부 점프문 (외울 필요 X)
eflags 에 영향을 가장 많이 받는 명령어들
REP
RCX 레지스터를 1씩 감소 시키면서, 문자열 관련 명령어를 처리한다.
memset, memcpy ...구현할 때
STOS
AX 를 EDI 가 가리키는 주소에 넣음
rep stos byte ptr [EDI]
SCAS (strcmp)
AX 에 저장되있는 값과 EDI 가 가리키는 곳에 저장되어 있는 값을 비교
PUSH, POP
push : 스택 최상위에 값을 넣음 : RSP register 증가
pop : 스택 최상위에서 값을 뺌 : RSP register 감소
ADD/ SUB/ MUL/ DIV
더하기, 빼기, 곱하기, 나누기
eflags 에 상당한 영향을 주는 명령어들임
STACK
- 함수 호출
- 지역 변수 저장 및 사용
( 전역변수는 STACK 사용하지 않는다.)
- 함수 인자 전달 (r7번째 인자부터)
RSP
항상 스택 최상위를 가리킴
PHSH POP 에 의해 증감
RBP
현재 함수 안에서 변수들의 기준점이 됨.
Return Address
함수 종료 후, 돌아갈 주소를 가르키고 있음
SFP ( Saved Frame Pointer, Stack Frame Pointer )
Caller 함수의 RBP 값을 가지고 있다.
위 내용과 관련된 보안 요소
1. POP 을 해도 RSP 의 값은 남아있다. ( 보안상 취약 )
2. RIP 를 직접적으로 변경시킬 수 있을까?
32 Bit 에서는 mov rip, 0x41414141 이 동작한다.
64 Bit 에서는 작동하지 않는다.
3. RIP 에 영향을 주는 것에는 어떤 것들이 있을까?
Later~~