처음부터 차근차근

리버싱과 어셈블리어 본문

정보보안

리버싱과 어셈블리어

_soyoung 2022. 3. 27. 03:58
반응형

레지스터

레지스터란 CPU 내부에 존재하는 다목적 저장 공간이다.

CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다.

 

레지스터의 종류

1. General Purpose Registers 범용 레지스터(32bit 짜리 8개)

 : 상수/주소 등을 저장할 때 주로 사용

범용레지스터 8개(중요)

레지스터 용도
EAX(Accumulator=축적자) 함수 리턴값 저장(산술연산에 사용)
ECX(Counter) 반복 카운트
EDX(Data) 자료 보관용. EAX 의 보조 역할
EBX(Base) 자료 임시 보관용으로 사용
ESP(Stack Pointer) 스택의 top 주소 저장
push될 때마다 4씩 감소(-4)
EBP(Base Pointer) 스택의 bottom 주소 저장
ESI(Source Index) 데이터 비교 or 복사할때 자료 임시 보관용으로 사용
EDI(Destination Index) 데이터 비교 or 복사할때 자료 임시 보관용으로 사용

 

2. Program Status and Control Registers (32bit 짜리 1개)

 : 프로그램 상태를 나타냄

EFLAGS

 

3. Instruction Pointer (32bit 짜리 1개)

 : 다음 실행될 명령어의 주소

EIP

 

4. Segment Registers (16bit 짜리 6개)

CS(프로그램 코드) , SS(스택 세그먼트), DS(데이터 세그먼트), ES, FS, GS

 

 

메모리 스택(Memory stack)

중앙처리 장치(CPU)와 붙어있는 RAM의 일부분이다.

함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.

쌓아 올린 값의 집합이며, 자료구조에서 기억 장치에 데이터를 일시적으로 겹쳐 쌓아 두었다가 필요할 때에 꺼내서 사용할 수 있게 주기억장치나 레지스터의 일부를 할당하여 사용하는 임시 기억장치이다.

 

스택의 역할

1) 로컬변수 임시저장
2) 함수 호출 시 파라미터 전달
3) 리턴 주소 전달

 

스택의 구조

데이터가 입력되면 ESP(Top)가 위로 올라가고 값이 해제되면 ESP(Top)는 아래로 내려온다.

EAX에는 스택에서 pop한 값이 들어간다.

 

 

어셈블리어 정리

명령어  
PUSH 스택에 값 입력
POP 스택의 최상위 값을  가져옴
ADD 덧셈(캐리 미포함)
SUB 뺄셈(캐리 미포함)
INC 피연산자의 값을 1증가
DEC 피연산자의 값을 1감소
RET CALL 스택에 PUSH되었던 주소로 다시 복귀
CMP 크기 비교(두 번째 피연산자에서 첫 번째 피연산자의 값을 가상으로 뺌)
JNZ(Jump if it's Not Zero) 결과값이 0이 아니면 점프(=제로 플래그가 0이면 점프)
JMP 오른쪽에 적힌 주소로 점프
JE(Jump if Equal) CMP로 두 값을 비교했을 때 두 값이 같으면 오른쪽에 적힌 주소로 점프
(=결과값이 0이면, 제로 플래그가 1이면)
NOP 아무 연산도 수행하지 않음
CALL 지정된 주소의 함수를 호출
JLE
CMP의 왼쪽인자의 값이 오른쪽 인자의 값보다 같거나 클 때 JUMP

RTN : EAX값 리턴

POP EAX : 스택의 제일 상단에 있는 값을 pop해서 EAX에 넣는다.

 

제로 플래그(Zero flag)

제로플래그는 기존 CPU 아키텍처에서 핵심 기능인 단일 비트 플래그이다.

연산 결과가 0이면 참(1)이고, 연산 결과가 0이 아니면 거짓(0)이다.

연산 대표적인 예 : CMP 10, 20

 

 

실습

<PUSH, POP 실습>

push 명령어를 통해 넣은 100이 EAX로 POP되어 EAX의 값이 100이 되고 스택의 top 주소를 나타내는 ESP의 값이 +4가 되었다.

<PUSH, POP 실습2>

PUSH 100 : 100을 스택에 넣는다.

PUSH 98 : 98을 스택에 넣는다.

POP EAX : 제일 상단에 있는 98을 POP하여 EAX에 넣는다.

그래서 EAX의 값은 98이 되었고, ESP의 값은 +4가 되었다.

 

<INC 실습>

원래 EAX에 들어있던 값인 100이 INC EAX 때문에 +1되서 101되었다.

 

 

<ADD 실습>

원래 ECX에 들어있던 값인 50이 ADD ECX, 3 때문에 +3되서 53이 되었다.

 

<CMP 실습>

CMP EDX, 6 : EDX의 값과 6을 비교한다. EDX의 값은 10이므로 10 - 6을 하면 4이다.

4는 0이 아니므로 제로플래그(Z)가 0(false)이 되었다.

 

<JNZ 실습>

PUSH 25 : 스택에 25를 넣는다.

POP EBX : 25를 EBX에 넣는다. ESP는 -4 된다.

CMP EBX, 10 : 25와 10을 비교. 25 - 10은 0이 아니므로 제로 플래그는 0이 나온다.

JNZ : 결과 값이 0이 아니기 때문에 00401000 주소로 점프한다.

 

<PUSH, POP 실습2>

EAX에 들어간 값 : 200

EBX에 들어간 값 : 100

 

<INC, DEC 실습2>

EAX에 들어간 값 : 101

100 +1(INC) +1(INC) -1(DEC) = 101

 

<JE 실습2>

ECX에 들어간 값 : 10

EDC에 들어간 값 : 5

CMP ECX, EDC : 10 - 5는 0이 아니므로 제로 플래그가 0이 됨

JE 00401002 : ECX, EDC가 같지 않으므로(제로 플래그가 0이므로) 00401002 주소로 점프하지 않고 아랫줄로 이동했다.

 

 

 

 

출처 : 정보보안(22-1학기)고수정교수 강의 내용 변형 및 요약

반응형

'정보보안' 카테고리의 다른 글

Crack(지뢰게임, music player 리버싱)  (0) 2022.04.10
Crack(코드우회)  (0) 2022.03.31
Patch  (0) 2022.03.19
리버싱  (0) 2022.03.12
Steganography(스테가노그래피)  (0) 2022.03.11
Comments