PC리버싱/(구)기초

리버싱관련 어셈블리어

Lamed_Dhhd 2020. 3. 9. 15:56
반응형

1 간단한 배경지식
CPU(중앙처리장치)는 0과1(기계어,이진수)
로 컴퓨터의 모든일을 행하고 작동하게한다
우리사람은 이걸 더쉽게하기위해 BCD(이진화 십진법)
을사용했고 이것도 어려워서 어셈블리어라는
하나의언어를만들었고 점점 더가면서 c언어,파이썬,자바등등이 생겼다
2 어셈블리어에대해서
어셈블리어는 명령어와 피연산자
쉽게나눌수있다
3 이제 인텔cpu구조인 ia32에대해서알아보자

 일단사진에서젤먼저보이는
EAX
ECX
EBX
EDX
를알아볼까요?
EAX는 계산(Accumulator)용으로곱셈과 나눗셈등계산에자주쓰입니다
ECX
횟수(count)용으로 반복문(loop)에쓰입니다
EBX
(base addr)용주소지정할때쓰입니다
EDX
데이터(data)용이고 곱셈과 나눗셈에eax랑같이쓰입니다
자이제세그먼트(segment)를배워보죠
- 세그먼트 레지스터(segment register)는 현재 세그먼트라고 하는 메모리의 한 영역에 대한 주소지정을 제공한다. PC 계열에서 사용되고 있는 인텔 프로세서들은 자신의 주소지정 능력을 제공한다.

CS레지스터는 프로그램의 코드 세그먼트의 시작 주소를 포함한다. 이 세그먼트 주소에 명령어 포인터(instruction pointer, IP) 레지스터의 오프셋 값을 더하면, 실행하기 위해 메모리로부터 가져와야 할 명령어의 주소가 된다.


DS 레지스터는 프로그램의 데이터 세그먼트의 시작 주소를 포함함다. 명령어는 이 주소를 사용하여 테이터의 위치를 알아낸다. 이 주소에 명령어의 오프셋 값을 더하면 데이터 세그먼트에 속한 특정 바이트 위치에 대한 참조가 생성된다.


SS 레지스터는 메모리 상에 스택의 구현을 가능하게 한다. 프로그램은 주소와 데이터의 임시 저장 목적으로 스택을 사용한다. 시스템은 프로그램의 스택 세그먼트의 시작 주소를 SS 레지스터에 저장한다. 이 세그먼트 주소에 스택 포인터(stack pointer, SP) 레지스터의 오프셋 값을 더하면, 참조되고 있는 스택의 현재 워드를 가리킨다.


ES 레지스터는 메모리 주소지정을 다루는 스트링(문자 데이터) 연산에서 사용된다. 이 경우 ES 레지스터는 DI(인덱스) 레지스터와 연관된다. 프로그램이 ES 레지스터를 사용할 경우에, 이 레지스터를 적절한 세그먼트 주소로 초기화해야 한다. 


FS와 GS레지스터. 이 레지스터는 기억장소 요구사항을 다루기 위해서 추가로 도입된 여분의 세그먼트 레지스터이다.
3. 포인터 레지스터

 - 포인터 레지스터에는 32비트 EIP, ESP, EBP가 있고, 오른쪽의 16비트 부분은 각각 IP, SP, BP이다. 


명령어 포인터(IP) 레지스터. 16비트 IP레지스터는 다음에 실행될 명령어의 오프셋 주소를 포함한다. IP가 현재 실행중인 코드 세그먼트에 속한 현재 명령어를 가리킨다는 점에서, 이 레지스터는 (CS:IP처럼) CS레지스터와 연관된다. 여러분은 보통 프로그램에서 IP 레지스터를 참조하지 않으나, DEBUG 프로그램을 사용하여 프로그램을 테스트 할 때와 같이 IP의 값을 변경할 수 있다.

 SP(stack pointer)와 BP(base pointer) 레지스터는 SS 레지스터와 연관되며, 시스템이스택 세그먼트에 속한 데이터에 액세스하는 것을 허용한다. 프로세서는 자동으로 이러한 레지스터들을 다룬다.


스택 포인터(SP) 레지스터. 16비트 SP 레지스터는 SS 레지스터와 연관될 때(SS:SP), 스택에 속한 처리중인 현재 워드를 참조하는 오프셋 값을 제공한다.

베이스 포인터(BP) 레지스터. 이 16비트 BP는 매개변수 참조 기능을 제공한다. 매개변수는 프로그램이 스택을 경유해서 전달하는 데이터와 주소들이다. 프로세서는 SS의 주소를 BP의 오프셋과 결합한다. 또한 BP는 특정 주소지정을 위해서 베이스 레지스터(base register)로서 DI나 SI와 결합될 수 있다.


4. 인덱스 레지스터

 - 인덱스 레지스터(index register)에는 32비트 ESI와 EDI가 있다. 이러한 레지스터의 오른쪽 16비트 부분을 각각 SI, DI라 한다. 이러한 레지스터는 인덱스 주소지정(indexed addressing)과 덧셈, 뺄셈에서 사용 가능하다.


SI 레지스터. 16비트 원시 인덱스 레지스터(source index register)는 스트링(문자) 조작 연산에서 필요하다. 이 경우 SI는 DS 레지스터와 연관된다.


DI 레지스터. 16비트 목적지 인덱스 레지스터(destination index register)도 스트링 연산에서 필요하다. 이경우 DI는 ES 레지스터와 연관된다.

 

OF(overflow)는 산술 연산 후 상위(가장 왼쪽) 비트의 오버플로를 나타낸다.]


DF(direction)는 스트링(문자) 데이터를 이동시키거나 비교할 때 왼쪽 또는 오른쪽의 방향을 결정한다.


IF(interrupt)는 키보드 입력과 같은 외부 인터럽트가 처리되어야 하는지 또는 무시되어야 하는지를 나타낸다.


TF(trap)는 단일 단계 모드(single-step mode)의 프로세서 연산을 허용한다. DEBUG와 같은 디버거 프로그램은 TF 플래그를 설정해서, 한번에 하나씩 명령어를 실행시키고, 레지스터와 메모리 상에서 그영향을 조사할 수 있게 한다.


SF(sign)는 산술 연산의 결과 값에 대한 부호를 포함한다.(0 = 양수, 1 = 음수)


ZF(zero)는 산술이나 비교 연산의 결과를 나타낸다.(0 = 결과값이 0이 아님, 1 = 결과 값이 0)


AF(auxiliary carry)는 특수화된 산술에서 사용되며, 그 산술 연산에서 비트 3에서 비트 4로의 캐리를 포함한다.


PF(parity)는 연산 결과 1비트들의 개수를 나타낸다. 그 개수가 짝수인 경우 짝수 패리티(even parity)라 부르며, 홀수인 경우 홀수 패리티(odd parity)라 한다.


CF(carry)는 산술 연산 후 상위(가장 왼쪽) 비트의 캐리를 포함한다. 또한 비트 자리이동(shift) 또는 비트 회전(rotate)연산 후 가장 마지막의 비트 내용을 포함한다.


다음은 플래그 레지스터를 그림으로 나타낸 것이다.


반응형