관리 메뉴

IT창고

System main함수의 인자와 시스템콜 본문

보안/System

System main함수의 인자와 시스템콜

방구석여포 2018. 1. 23. 22:10

C표준에서 정의되는 main함수는 딱 두 가지로 아래와 같습니다.

- int main();

- int main( int argc, char *argc[] )


이 두개가 표준 원형이며 void main(void)같은건 실제 컴파일이 되며 어셈블리어로 변형될때 int main으로 바뀝니다.

또한 main 함수를 사용할때 인자를 생략해도 int argc, char *argc[] 인자는 존재합니다.


배열 포인터: 배열을 가르키는 포이터

포인터 배열: 주소가 들어있는 배열


|주소 | 주소|  ....| null |     =    *argv[]


C언어 인자가 없는 경우에 대해 알아보겠습니다.

인자를 입력하지 않아도 하나의 인자는 들어가 있음을 확인할수있습니다. 그리고 인자를 개수를 추가할때마다 출력값이 늘어남을 확인할수있습니다.



이번에는 argv도 확인해보았습니다. argv와 *argv는 주소가 들어가있음을 확인할수있습니다. 주소안에 주소가 들어가있는걸 더블 포인터라고 합니다.


이번에는 어셈블리어로 확인해보겠습니다. 


segment         .data

prompt_hex      db      'address: 0x%08x',10,00

prompt_chr      db      'memory: %c ',10,00

prompt_int      db      'argc: %d ',10,00


데이터영역을 위와 같이 주었습니다.



아무런 인자가 없어도 인자가 1개있으며 argv[]안에 주소가 있음을 확인했고 더블포인터를 사용하면 메모리로 확인할수있음을 볼수있습니다. 한글자만 가져와서 . 이 있음을 확인할수있습니다.


시스템콜에 대해 알아보겠습니다.


그전에 시스템 프로그래밍에 대해 알아보겠습니다.

프로그래밍은 게임프로그래밍이나 네트워크프로그래밍이 있습니다. 공통점으로 라이브러리를 사용하는데 시스템 프로그래밍은 

윈도우는 winAPI 리눅스는 시스템콜(SystemCall)을 사용하여 프로그래밍을 합니다.



응용프로그램 즉 사용자인터페이스(shell)에서 하드웨어를 제어하기 위해서 리눅스에서는 시스템콜을 사용하여 시스템 프로그래밍을 합니다.

C언어에서는 시스템콜과 동일한 래퍼함수를 지원하며 리눅스에서는 커널에 자원을사용할수있는 명령어 시스템콜을 사용합니다.

만약 printf문을 사용해도 리눅스의 어셈블리어는 write 시스템콜을 사용하게 됩니다. 함수 호출을 통한 시스템콜 함수는 사용하지 않습니다.

시스템콜은 eax레지스터에 해당 시스템콜 번호를 넣고 ebx,ecx,edx 레지스터에 인자를 넣어 사용하며 인자가 3개를 넘으면 Stack을 사용합니다. 시스템콜 호출은 인터럽트명령어를 사용하여 호출하게 됩니다.


현재 리눅스에서는 600개 이상의 시스템콜을 지원하며 https://syscalls.kernelgrok.com/ 시스템콜 참조 사이트에서 어떤 시스템콜이 있는지 확인할수있습니다.


어셈블리어에서  레지스터를 사용해서 인자를 전달하고 인터럽트 명령어를 사용하여 호출하게 됩니다.


Tip 

프로그램의 구조를 파악할수있는 명령어 두 개에 대해 알아보겠습니다.

ltrace : 실행 프로그램에서 사용중인 C라이브러리 함수 확인

strace: 실행 프로그램에서 사용중인 시스템콜을 확인


ltrace 명령어로 .c파일로 만들어진 실행파일을 확인해보면 printf 함수를 사용한걸 알수있습니다.

strace 명령어로 .asm파일로 만들어진 실행파일을 확인해보면 첫줄에 execve 시스템콜이나옵니다. execve는 시스템을 실행하는 시스템콜입니다.


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

System BufferOverFlow  (0) 2018.01.30
System 디버거(de-bugger)  (0) 2018.01.25
System 메모리구조와 어셈블리어 함수  (0) 2018.01.22
System 어셈블리어 반복문  (0) 2018.01.18
System 명령어와 분기문  (0) 2018.01.17
Comments