기본 ASM
필수적인 부분인데 GDB를 이용하여 리턴 어드레스를 찾고, 쉘코드를 작성할 때 등등 반드시 알고 있어야 하는 부분이다.
GDB
GNU 디버거로 gnu 소프트웨어 시스템을 위한 기본 디버거인데 GDB는 다양한 유닉스 기반의 시스템에서 동작하는 이식성 있는 디버거로써 여러 프로그래밍 언어를 지원하는 디버거이다.
리턴 어드레스
리턴 어드레스란 다음에 실행해야하는 명령이 위치한 메모리 주소로써 ret 부분이 자신이 원하는 명령이 들어가 있는 메모리의 주소로 덮어쓴다면 자신이 원하는 명령을 수행 할 수 있고 간단한 예시로 쉘을 실행시키는 코드를 메모리 어딘가에 지정해놓은 후 그 주소를 ret 부분에 써지도록 하면 함수 종료 후에 쉘을 실행시키는 코드가 실행이 된다.
쉘코드
쉘코드(Shellcode) 는 시스템의 특정 명령을 실행하는 작은 사이즈의 프로그램을 뜻하며, 일반적으로 기계어 코드로 되어있다.
쉘코드란 단어는 공격 대상 시스템의 명령어 쉘을 실행시킨다는 의미로부터 파생되었으며, 주로 소프트웨어 취약점을 통한 공격(Exploitation) 이후 실행되는 작은 규모의 프로그램(Payload)으로 사용된다.
용어 해석을 해드렸고 이제 시작해보자
레지스터 수정
우리는 앞에서 레지스터가 무엇인지 알아냈다. 레지스터를 수정하는 방법을 알아 볼 것 인데, 레지스터의 값은 다음과 같다.
MOV 목적지 , 값
AX를 56h 와 같게 하려면
MOV AX,56H : AX의 값이 56h이 되었다.
값으로 다른 레지스터를 사용하려면
MOV AX, BX : AX의 값이 BX 의 값으로 대체 되었다.
만약 BX의 값이 45H 라면 AX의 값은 45h가 된다.
이제 XCHG 연산자의 용법에 대해 알아 볼 것인데 , XCHG는 두 레지스터를 서로 바꾼다 라는 뜻이다.
XCHG 레지스터 1, 레지스터 2
예를 들어 본다면
MOV DX, 56h
MOV AX, 3Fh
XCHG DX,AX
이 예에서 DX 는 56h 이고 , AX는 3Fh 인데, 서로의 값을 교환함으로써(XCHG) DX 는 3Fh 가 되었으며 , AX는 56h가 되었다.
참고: 8 비트(h/l) 레지스터와 16 비트(X)와 교환하지 않도록 해야 한다. 다음 코드는 무효이다.
XCHG AH, BX
INC 와 DEC
INC는 증가하다이고 DEC은 감소하다에서 나온것이다.
MOV DX, 50h : DX의 값은 50h으로 설정
INC DX : DX의 값을 증가시켜 이제 51h가 되었다. 즉 , DX++
MOV DX, 50h : DX의 값은 50h로 설정
DEC DX : DX의 값을 감소시켜 4F가 되었다. (50h - 1h = 4Fh) 즉, DX--
스택 조작
스택 조작에 사용되는 스택 연산자에는 6 개가 있으며, 그 중 2 개가 가장 많이 사용된다. 그것은 POP 과 PUSH 이다.
POP 레지스터
PUSH 레지스터
나중에 사용하기 위해 스택에 있는 AX 에 값을 일시적으로 저장하고자 한다고 가정하자.
PUSH AX
그리고 원래의 값을 회복하고자 한다면 POP 을 사용하면 된다.
POP AX
주목할 것은 스택이 단지 16 비트 레지스터만 받아들인다는 것이다.
이제 여태까지 언급한 것을 다음 예를 통해 연습해보자. 최종 AX 와 BX 값이 얼마인지 확인해보아라.
MOV AX, 51h
MOV BX, 4Fh
XCHG AX, BX
PUSH AX
MOV AX, 34h
POP BX
PUSH BX
POP AX
이렇게 하면 AX=4Fh , BX= 4Fh 가 나온다.
MOV AX,51h ;AX 의 값이 51h 이 되었다.
MOV BX,4Fh ;BX 의 값이 4Fh 가 되었다.
XCHG AX,BX ;AX 의 값과 BX 의 값이 변경되었다.
AX=4Fh 로, BX 의 값이 51h
PUSH AX ;AX 의 값을 저장한다.
MOV AX,34h ;AX 의 값에 34h 를 넣어두고
POP BX ;BX 의 원래 값을 회복. 즉, BX = 4Fh
PUSH BX ;BX 의 값이 4Fh
POP AX ;AX = 34h 에서 이전의 값을 회복. 즉, 다시 4Fh 가 된다.
수학 연산자 조작
수학 연산자에 기본 4 가지 ADD, SUB, MUL, DIV 가 있다.
ADD는 더하기
SUB는 빼기
MUL은 곱하기
DIV는 나누기이다.
먼저 ADD 에 대해 알아보자. ADD 의 문장 구조는 다음과 같다.
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)
다른 예를 들어보자.
MOV AX, 5h
ADD AX,4h :AX = 5h, 여기에 4h를 더하고 결국 AX의 값은 5h + 4h 가 된다.
이제 SUB에 대해 알아보자 . 문장은 다음과 같다.
SUB
SUB 레지스터 1, 레지스터 2
SUB 레지스터 , 값
MOV BX,4Fh ;BX 의 값은 4Fh
SUB BX,5h ;BX 의 값에서 5h 를 뺌. 결국 4A 가 됨.
* 혹시 이 계산이 아직 어려운 사람은 다음과 같이 각 수를 먼저 10 진수로 전환한 후 그 10 진수를 계산하고, 그런 다음 16 진수로 전환해본다.
16 진수, 10 진수 전환이 가능한 간단한 계산기가 옆에 있으면 좋을 것이다.
4Fh - 5h = 4A
MUL
MUL에 대해 알아볼 것인데 하나의 operand 만 필요하다 . 이것은 프로세스가 주어진 레지스터를 AX 또는 AH로 곱하기를 원한다고 추정하기 때문이라고 한다.
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
이제 AX의 값은 Fn 가 되었다. (4Fh / 5h = Fh)
4Fh = 79
5h = 5
79 / 5 = 15.8
15 = Fh
BIT 연산자
Bit 연산자는 AND , OR , XOR , NOT 이 있다. 이 연산자들은 두 값을 bit 단위로 비교 해주는 것이다.
차후에 오버플로우 공격을 위해 쉘코드를 만들때 중요하다.
AND
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 테이블을 보면 쉽게 알 수 있다.
AND truth table:
0 AND 0 = 0
1 AND 0 = 0
0 AND 1 = 0
1 AND 1 = 1
OR
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이면 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 레지스터
NOT 값
MOV AX, F0h
NOT AX
AX = F 가 되었다. F0h = 11110000 이고 , 이것을 거꾸로 하면 00001111 가 될 것이다. 결국 F가 된 것 이다.
NOT truth table:
NOT 1 = 0
NOT 0 = 1
이상입니다
'보안 > 리버싱' 카테고리의 다른 글
2. 메모리와 세그먼트 그리고 레지스터 (0) | 2019.01.09 |
---|---|
1. 어셈블리어 기초 ( 수의 체계 ) (0) | 2019.01.09 |