[리버싱] Assembly 어셈블리어
드림핵 시스템해킹/리버스 엔지니어링 공부하면서 요약함
1000101과 같은 기계어는 사람이 읽고 이해하기 매우 어려운 반면에
어셈블리어는 비교적 사람이 이해할 수 있으면서도 기계어와 치환되기 때문에 꼭 필요함!
어셈블리어 문법
mov eax, 3
mov는 대입을 뜻하는 명령어, eax와 3은 피연산자 Operand로
eax에 3을 대입하라는 뜻이다
피연산자에는 상수, 레지스터, 메모리 3가지가 가능하다
메모리 피연산자는 BYTE 1바이트, WORD 바이트, DWORD 4바이트, QWORD 8바이트로 나뉨
어셈블리어 주요 명령어
명령어 | 기능 |
MOV, LEA | 데이터 전송, 이동 |
ADD, SUB | 덧셈, 뺄셈 |
CMP | 두 값을 비교하고 플래그 설정 |
JMP, JE, JNE | 무조건 점프, 조건부 점프 |
PUSH, POP | 스택에 데이터 푸시 및 팝 |
CALL, RET | 함수 호출 및 반환 |
이중 MOV와 LEA가 둘 다 값 이동이라 헷갈리는데 MOV의 경우 데이터 값을 복사,
LEA는 메모리 주소를 계산해서 레지스터에 저장하는 차이가 있다
이외에도 AND, OR, XOR 등 논리 연산역시 가능하다
1: mov rax, 0xA
2: mov rbx, 0xA
3: cmp rax, rbx ; ZF=1
제로 플래그가 성립되기 때문에 두 값이 같았다는 걸 알 수 있음
실행흐름을 바꾸는 rip 분기 명령어도 있는데
jmp: 이동하는 역할
je: 두 피연산자가 같으면 점프 (jump if equl)
jg: 전자 피연산자가 더 크면 점프 (jump if greater)
프로시저를 호출한 후에 원래 실행 흐름으로 반환해야 하므로 프로시저로 rip를 이동해야 한다
이를 위한 명령어는 call, leave, ret을 사용
각 함수가 각각 필요한 연산을 하기 위해 스택프레임을 사용
리눅스는 여러 계층으로 나누어지는데
시스템 소프트웨어가 전체 시스템을 제어하는 커널모드
운영체제가 사용자에게 부여하는 유저모드
유저 모드에서 커널 모드에 요청하는 시스템 콜이 있다(read, write, open, close, connect etc)

실습하면서 천천히 알아가는 단계..