티스토리 뷰

pwnable/정리

어셈블리어 기초 정리

ba0bab 2017. 12. 14. 11:52

어셈블리어에 대해 기초적인 것을 정리한 것.


기본 ASM

     - 아래 내용은 시스템에 해킹 공부에서 필수적인 부분.

- GDB에서 어드레스를 찾고, 쉘코드를 작성할 때 등등 알아야 함.

 

MOV연산자 : 레지스터에 어떤 값을 부여하기 위해 씀

 

MOV 목적지,

 

)
AX56h과 같게 하려면

MOV AX,56h ; AX의 값이 56h가 되었다.

 

XCHG연산자 : 단순히 두 레지스터를 exchange.

 

MOV DX, 56h

MOV AX, 3Fh

XCHG DX, AX

 

DX56h, AH3Fh 인데. 서로의 값을 교환함.

 

*참고로 8비트 레지스터와 16비트 레지스터와 교환하지 않도록 해야 한다.

)

XCHG AH, BX

 

INC연산자 : increase, ++을 해줌

)

MOV DX, 50h ;DX의 값은 50h로 설정

INC DX ;DX의 값은 51h가 되었다. , DX++

 

DEC연산자 : decrease, --를 해줌

)

MOV DX, 50h ;DX의 값은 50h로 설정

DEC DX ;DX의 값은 4F가 되었다.(50h-1h=4Fh) , DX--

 

다음은 스택 조작에 대해 알아보자. 스택 조작에 사용되는 스택 연산자는 6 개가 있으며, 그 중 2개가 제일 많이 사용된다. 그것은 PUSH, POP이다. 이것들의 문법은 다음과 같다.

 

POP 레지스터

PUSH 레지스터

 

나중에 사용하기 위해 스택에 있는 AX 에 값을 일시적으로 저장하고자 한다고 가정 할 때,

간단히

PUSH AX 하면 된다.

 

그리고 원래의 값을 회복하고자 한다면 POP을 사용하면 된다.

 

POP AX

 

주목해야 하는 것은 스택이 단지 16비트 레지스터만 받아들인다는 것이다.

 

수학 연산자

 

ADD, SUB, MUL, DIV 가 있다

 

ADD

 

ADD 레지스터1, 레지스터 2

ADD 레지스터,

 

MOV AX,5h ;AX 의 값은 5h

MOV BX,4h ;BX 의 값은 4h

 

ADD AX, BX ; AXBX를 더하고, 그 값을 AX에 저장 (5h + 4h = 9h = AX)

 

SUB

 

문장 구조는 다음과 같다.

 

SUB 레지스터 1, 레지스터 2

SUB 레지스터,

 

MOV BX,4Fh ;BX 의 값은 4Fh

SUB BX,5h ;BX 의 값에서 5h 를 뺌. 결국 4A 가 됨.

 

 

 

 

 

 

 

 

MUL

 

문장 구조는 다음과 같다.

 

MUL 레지스터

 

MOV AX,5h

MOV BX,4Fh

MUL BX

 

AX 의 값을 결국 18B(4Fh x 5h = 18B)가 되게 한다.

 

DIV

 

문장 구조는 다음과 같다.

 

DIV 레지스터

 

MUL과 마찬가지로 하나의 operand가 있다. 예를 들어 보자.

 

MOV AX,5h

MOV BX,4Fh

DIV BX

 

비트 연산자

AND의 문장 구조:

AND 레지스터 1, 레지스터 2

AND 레지스터,

 

AND 는 만약 두 오퍼랜드가 1 일 경우만 1 을 리턴한다. 이게 무슨 말인가? 다음 예를

들어보자.

MOV AX,5h

MOV BX,6h

AND AX,BX ;AX 의 값이 4 가 됨.

AX 의 값이 최종 4 가 된 것은 다음과 같은 이유에서이다. 먼저 16 진수를 bit 단위로

비교하기 위해 2 진수로 변환한다.

5h = 101b

6h = 110b

101b

110b

---

100b = 4h

 

AND truth table:

0 AND 0 = 0

1 AND 0 = 0

0 AND 1 = 0

1 AND 1 = 1

오퍼랜드가 둘 다 1일 때 1을 리턴.

 

OR 문장구조 :

OR 레지스터 1, 레지스터 2

OR 레지스터,

 

OR은 오퍼랜드 중 어느 하나라도 1이면 1을 리턴한다.

 

MOV AX,5h

MOV BX,6h

OR AX,BX

AX 의 값은 이제 7h 가 되었다.

5h = 101b

6h = 110b

101b

110b

----

111b

111b = 7h

 

 

OR truth table:

0 OR 0 = 0

1 OR 0 = 1

0 OR 1 = 1

1 OR 1 = 1

 

 

 

 

 

 

 

 

XOR 문장 구조:

 

XOR 레지스터 1, 레지스터 2

XOR 레지스터,

 

XOR은 오퍼랜드가 만약 어느 하나가 1이면 1을 리턴하고 둘다 1이면 0을 리턴

 

MOV AX,5h

MOV BX,6h

XOR AX,BX

최종 값이 나오는 과정을 보자.

5h = 101b

6h = 110b

101b

110b

----

011b

11b = 3h

 

XOR truth table:

0 XOR 0 = 0

1 XOR 0 = 1

0 XOR 1 = 1

1 XOR 1 = 0

 

NOT 문장 구조

 

NOT 레지스터

NOT

 

예를 보자.

MOV AX, F0h

 

NOT 레지스터

NOT

예를 보자.

MOV AX,F0h

NOT AX

AX F 가 되었다. F0h = 11110000 이고, 이것을 거꾸로 하면 00001111 가 될 것이고, 결국

F 가 된 것이다.

NOT truth table:

NOT 1 = 0

NOT 0 = 1 

'pwnable > 정리' 카테고리의 다른 글

ShellShock bash shell 취약점(CVE-2014-6271)  (0) 2018.01.01
IA32 인텔 CPU 구조, 레지스터  (3) 2017.12.20
쉘코드 모음 정리  (1) 2017.12.14
올리 디버거 기초 사용법, 명령어  (0) 2017.12.14
CPU 레지스터 정리  (0) 2017.12.14
Comments