본문 바로가기
Security/Reversing

[Dreamhack Reverse Engineering] STAGE 4

by 단월໒꒱ 2022. 5. 6.

[x86 Assembly]

1. 어셈블리 언어

 1) 어셈블리 언어

   - 컴퓨터의 기계어와 치환되는 언어

   - CPU에 사용되는 ISA의 종류만큼 많은 수의 어셈블리어가 존재

     ex. x64에는 x64의 어셈블리어 존재

 

2. x64 어셈블리 언어

 1) 기본 구조

   - 명령어 + 피연산자로 구성

   - 명령어 : 동사에 해당

   - 피연산자 : 목적어에 해당

   - 예시

 

 

 

 2) 명령어 

 

데이터 이동 mov, lea
산술 연산 inc, dec, add, sub
논리 연산 and, or, xor, not
비교 cmp, test
분기 jmp, je, jg
스택 push, pop
프로시저 call, ret, leave
시스템 콜 syscall

 

 3) 피연산자

   - 상수, 레지스터, 메모리

   - 메모리 피연산자는 []으로 둘러싸인 것으로 표현, 앞에 TYPE PTR 추가 가능

      ㄴ 타입에는 BYTE, WORD, DWORD, QWORD가 올 수 있음 (각각 1, 2, 4, 8바이트의 크기 지정)

   - 예시

 

 

 

3. x86-64 어셈블리 명령어

 1) 데이터 이동

   - 어떤 값을 레지스터나 메모리에 옮기도록 지시

 

 

 

 

 

 2) 산술 연산

   - 덧셈, 뺄셈, 곱셈, 나눗셈 연산 지시

 

 

 

 3) 논리 연산

   - and, or, xor, neg 등의 비트 연산 지시

   - 연산은 비트 단위로 이루어짐

 

 

 

 4) 비교

   - 두 피연산자의 값 비교하고 플래그 설정

 

 

 

 5) 분기

   - rip을 이동시켜 실행 흐름을 바꿈

 

 

 

 6) 스택

   - push, pop 명령어로 스택 조작 가능

 

 

 

 7) 프로시저 

   - 특정 기능을 수행하는 코드 조각

   - 프로시저 사용하면 반복되는 연산을 프로시저 호출로 대체할 수 있음

   - 호출 : 프로시저 부르는 행위

   - 반환 : 프로시저에서 돌아오는 것

   - 프로시저를 호출할 때는 프로시저를 실행하고 원래의 실행 흐름으로 돌아와야 하므로, call 다음의 명령어 주소를 스택에 저장하고 프로시저로 rip을 이동시킴

 

 

 

 

 

 

 

   - 스택 프레임을 할당하고 해제하는 과정

 

012345678

 

 

Quiz : x86 Assembly

 

 

코드를 차근차근 보면

1. PTR[rsi+rcx]에 들어있는 값의 하위 8비트를 dl에 넣어준다.

2. dl과 0x30을 xor 연산한 값을 dl에 저장한다.

3. dl 값을 PTR[rsi+rcx]에 넣어준다.

4. rcx 값을 1 증가시킨다.

5. rcx와 0x19를 비교한 후 플래그를 설정해준다.

6. 앞에서 전자가 더 클 경우 end로 점프해준다.

7. 1번 코드로 다시 돌아간다.

 

위의 설명을 토대로 연산을 거친 후에 메모리에 저장된 데이터를 확인해보면 아래와 같다.

 

 

0x57 0x65 0x6c 0x63 0x6f 0x6d 0x65 0x20
0x74 0x6f 0x20 0x61 0x73 0x73 0x65 0x6d
0x62 0x6c 0x79 0x20 0x77 0x6f 0x72 0x6c
0x64 0x21 0x00 0x00 0x00 0x00 0x00 0x00

 

 

이를 문자열로 변환해주면 Welcome to assembly world!가 나온다.

댓글