레지스트
어셈블러에서는 레지스터, 메모리를 이용한다!
더 자세하게 알기 위해서는 컴퓨터 CPU 의 구조에대해서 알아야한다 ( 레지스터 )
과연 어떤 레지스터가 사용되고 어떤식으로 사용되는지 공부해보자.
• General-purpose registers. These eight registers are available for storing operands and pointers.
• Segment registers. These registers hold up to six segment selectors.
• EFLAGS (program status and control) register. The EFLAGS register report on the status of the program being executed and allows limited (application-program level) control of the processor.
• EIP (instruction pointer) register. The EIP register contains a 32-bit pointer to the next instruction to be executed.
일단 위와같이 크게 4가지로 나뉜다.
각각 범용 레지스터, 세그먼트레지스터 , 플레그 레지스터, Instruction 포인터 레지스터 으로 나뉜다.
가장 많이 사용되는 것은 범용 레지스터이다!
• EAX — Accumulator for operands and results data
// 연산된 결과나, 연산을 위한 레지스터
• EBX — Pointer to data in the DS segment
// 주소, 데이터세그먼트 주소 등을 표현
• ECX — Counter for string and loop operations
// 횟수를 위한 레지스터
• EDX — I/O pointer
// 데이터 ( 입력 출력을 위한 포인터 ) 레지스터
하지만 정확하게 이런식으로 사용되지 않는다.
단지 암묵적 약속(?) 으로 이런식으로 사용하자~ 라는 메뉴얼
그래서 범용 레지스터 들이다.
따라서 용도를 파악하기 힘들다, 분석을 잘해야지 어떤 용도로 사용되는지
알수가 있다!
범용 레지스터
EAX ( Extended Accumlator Register )
EBX ( Extended Base Register )
ECX ( Extended Counter Register )
EDX ( Extended Data Register )
포인터 레지스터
ESI ( Extended Source Index )
EDI ( Extended Dstination Index )
ESP ( Extended Stack Pointer )
EBP ( Extended Base Pointer )
EIP ( Extended Instruction Pointer )
!! 주소를 다루는 레지스터들...
플래그 레지스터
!! 프로세스의 상태 정보를 저장하는 역할.
여기서 확인해 볼 수 있는 특징은
- mov dst, src
dst : reg/mem
src : reg/mem/imm
!! dst, src 둘다 mem 올수가 없다!!!
int num ;
int main(){
num = 10;
printf("num is : %d\n", num);
}
위의 C로된 코드를 어셈블리로 코드를 작성해서 실행파일을 만들어보자!
순서대로 각각 필요한것 부터 생각해보면!
일단 세그먼트에 들어가야 하는 것들 부터 하나씩 생각해야 된다.
자 우리가 이용하는 세그먼트는 세가지이다
.data , .bss , .text
자 일단 위의 C 코드를 해석한되로 코드를 짜보았다.
각각의 세그먼트를 설명하면
.data : 출력할 문자열의 데이터를 넣어주었다
.bss : 초기화되지 않은 데이터 선언 ( 쉽게 변수만 선언 )
.text : 코드부분 ( 즉 코드가 실행되는 실질적인 부분 )
여기서 main 을 보면 push 를 두번 해주었는대
이유는 printf 에서 인자가 두가지이 때문에 두번 넣어주었다!
하지만 에러가 난다... 이유는!
num 은 단지 주소의 값을 가지고 있을뿐
즉 전에 했던것은 주소의값에 또 값을 넣었기 떄문에 에러가 났다.
그러니 주소값을 메모리로 사용하기 위해서는 위와같이
포인터 형식으로 사용해주어야한다!!
그리고 또 중요한것!!
메모리를 만들어 주었지만 크기를 지정해주지 않았다.
위의 .bss 에서 resd 라고 크기를 지정해주었지만 코드 부분에서 다시 지정해주어야 하는
이유는 바로 num 은 시작주소 만을 가지고 있을 뿐이기 때문!!
즉 끝을 모른다....
그러니 크기를 다시 지정!
* 또 extern pritnf 해주어야한다! ( C 라이브러리 사용 하기 때문 )
완성된 코드이다
각각의 역할을 정확히 이해하고 코드를 짜야된다..
즉 분석을 잘하기 위해서는 방금과 같은 연습이 많이 필요하다고 한다!
열심히 연습해야겠다..!
컴파일을 완성시키면 위와같이 실행!
'System_Security' 카테고리의 다른 글
06. 프로세스 메모리 구조 (0) | 2017.07.26 |
---|---|
05. 분기문,반복문 (0) | 2017.07.24 |
04. 비트연산자 & 형변환 (0) | 2017.07.20 |
03. 어셈블리 사칙연산 (0) | 2017.07.19 |
01. 프로그램의 개념 (0) | 2017.07.14 |
댓글