관리 메뉴

IT창고

System 어셈블리어 본문

보안/System

System 어셈블리어

방구석여포 2018. 1. 12. 22:30

오늘은 어제 배웠던 컴파일에 써던 프로그램으로 어셈블리어에 대해 알아보겠습니다.



nasm 문법으로 만든 어셈블리어 입니다. 


위의 어셈블리어를 C언어로 바꾸면 

----------------------------------------

#include<stdio.h>


int main()

{

printf("Hell, World !!!\n");

return 0;

}

----------------------------------------


간단한 print출력문입니다. 



오른쪽은 test2 파일의 메모리 정보입니다 0번 파일옵셋에 7f45 4c46이 헤더정보를 나타냅니다.

왼쪽이 objdump로 좀 더 자세히 정보를 확인할수있는데 off와 vaddr로 메모리의 크기를 알수있고 flags를 보고 어떤 세그먼트를 가졌는지 알수 있습니다.

test.asm 파일안을 보면 .bss 와 .comment는 작성하지 않았지만 확인되는데 align이 2^0이기 때문에 사실상 없다고 봐도 됩니다.


실행파일의 구조를 보면 

3G 일반메모리의 시작주소가 0xc0000000이며 마지막 주소는 0xffffffff로 끝이납니다. 메모리의 주소는 리눅스 버전이나 윈도우의 버전이 높아짐에 따라 바뀌는데 레드햇 리눅스 6.2버전은 가장 초기 단계 버전이라 시스템 공부를 위하여 사용하고 있습니다.



objdump 의 -d옵션으로 실행코드만 확인해볼수있습니다. 


nasm의 문법에 대해 자세히 알고 싶다면 http://www.nasm.us/xdoc/2.13.02/html/nasmdoc0.html 를 참고합니다.


test파일을 확인해보면 인자가 1개있는걸 확인할수있습니다.


어셈블리어에서 push는 인자를 전달해주는 역활을 해주고 call은 전달된 인자를 호출해주는 역활을 해줍니다.


그렇다면 어셈블리어로 간단한 프로그램을 만들어보겠습니다.



먼저 왼쪽 위에 C소스파일을 살펴보겠습니다. 인자값을 4개로 주었습니다.


이번에 오른쪽을 보면 왼쪽 C소스를 어셈블리어로 바꾼 모습입니다. PUSH값을 4개 주고 call을 4번 불러 왼쪽 아래와 같은 결과가 나옵니다.


실제 C파일이나 asm파일 모두 같은결과가 나옵니다.


어셈블리어에 대해  알아보겠습니다.

C언어 데이터타입에는 숫자(정수,실수) 문자(') 문자열(")이 있습니다 어셈블리어에서 문자와 문자열의 차이는없고 인자값을 봅니다.

숫자는 C언어일 경우 int 정수형이지만 어셈블리어에서는 16진수는 h 10진수는 d 8진수는 o 입니다.



어셈블리어 표기법에 맞게 작성하면 사용할수있습니다. golbal  _start 는 외부에서 entry point를 찾을수있도록 명시합니다.


에셈블리어에는 레이블(ex. 이름표)이 있습니다. 레이블이 변수로 착각하기 쉬운데 레이블은 주소값(0x00...)만을 나타내고 변수는 값,주소,크기(int var )를 모두 갇는 값입니다.



여기서 string은 레이블에 해당합니다. 레이블의 이름은 변수처럼 무작위로 사용해도 됩니다.


어셈블리어의 데이터의 크기를 알아보겠습니다.

어셈블리어는 접두사가 있습니다 d, res가 있으며 단위는 아래와 같습니다.

byte 

unit 

 1 

(b)yte 

cher 

 2 

(w)ord 

short 

4

(d)word 

int, float, pointer, .... 

8

(q)word 

long long, double 

10 

(t)enbyte 

 


레이블 옆에 db가 있습니다. 여기서 d는 접두사이고 b는 unit 입니다 nasm에서 사용하는 문법으로 해당 사이트에 가서 데이터 타입에 대해 자세히 알수있습니다.



.bss 세그먼트안에 buffer resb 1024는 C로 바뀐다면 char buffer[1024]; 로 바꿀수있습니다. 레이블을 써주고 접두사를 사용합니다.


main: 이후의 명령어는 CPU마다 레스스트가 달아서 명령어가 모두 다릅니다. 현재 사용하는 CPU는 인텔i3이고 objdump -x 옵션에 CPU하드웨어 정보도 확인할수있습니다.


'보안 > System' 카테고리의 다른 글

System 명령어와 분기문  (0) 2018.01.17
System 어셈블리어 사칙연산  (1) 2018.01.17
System 레지스터(Register)  (0) 2018.01.16
System 컴파일  (0) 2018.01.11
System Hacking 실습환경 구성  (0) 2018.01.10
Comments