티스토리 뷰
어셈블리어에 대해 기초적인 것을 정리한 것.
기본 ASM
- 아래 내용은 시스템에 해킹 공부에서 필수적인 부분.
- GDB에서 어드레스를 찾고, 쉘코드를 작성할 때 등등 알아야 함.
MOV연산자 : 레지스터에 어떤 값을 부여하기 위해 씀
MOV 목적지, 값
예)
AX를 56h과 같게 하려면
MOV AX,56h ; AX의 값이 56h가 되었다.
XCHG연산자 : 단순히 두 레지스터를 exchange함.
MOV DX, 56h
MOV AX, 3Fh
XCHG DX, AX
DX는 56h, AH는 3Fh 인데. 서로의 값을 교환함.
*참고로 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 ; AX에 BX를 더하고, 그 값을 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 |
- pwnable
- SQLi
- overflow
- fsop
- 해킹
- TLS
- ebp change
- srop
- hacking
- tcache
- HackCTF
- pwable
- rt_sigreturn
- heap
- oob
- 본선가고싶다
- shellcoding
- FSB
- stack reusing
- glibc
- pwnable.tw
- fastbindup
- exit
- fastbin
- codegate
- Total
- Today
- Yesterday