Reversing

Assembly Basic

믿고걸음 2019. 7. 6. 12:43

 

 

Assembly 란


프로그래밍 언어 중 하나, 기계어에서 한 단계 위의 언어

low level 언어에 속한다.

기계어는 CPU 가 채택한 ISA 에 따라 다르기 때문에 명령어 역시 통일된 규격이 없다.

문법 아키텍쳐에 따라서도 다르고 어셈블러의 종류에 따라서도 문법/매크로 등이 다르다.

 

MIPS / Intel / SPAC ... 에 따라 다름

 

 

 

 

 

OP Code


Binary code > Hex Code

Hex Code 를 조금더 알아보기 쉽게 > Assembly

 

 

 

 

https://software.intel.com 

 

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~~