Information Security

main 함수의 인자 argc, argv 본문

System Hacking

main 함수의 인자 argc, argv

leeeeye321 2018. 1. 24. 05:41

우리는 메인 함수를 정의할 때 int main()을 사용하지만 사실 메인 함수의 원형은 다음과 같다.

 

int main(int argc, char *argv[]);

 

saved ebp

saved eip

argc

*argv

여기서 ebp는 main 함수의 기준점이다.

argc, *argv는 main 함수가 호출되기 전에 항상 존재하고 있다.

 

argc는 인자의 개수를 저장하고 있다.

 

값을 확인해보면 인자를 입력하지 않아도 무조건 `1이다.

-> 실행 파일명(./a.out)도 인자로 간주하기 때문이다.

 

프로그램을 실행할 때 main 함수로 전달되는 인자를 space로 구분해서 지정할 수 있다.

-> 실행 파일 + 3개의 인자 = 4

 

위의 C 코드를 어셈블리어로 변환한 것이다.

-> argc는 main 함수의 기준점에서 +8바이트 [ebp+8]에 위치해있다.

 

실행파일명 + 인자는 모두 argv 포인터 배열에 저장된다.

 

배열에 실행 파일부터 인자가 차례대로 들어가고 배열의 끝을 확인하기 위해서 마지막 인덱스에 NULL 바이트가 들어간다.

 

[주소][주소][주소]...[null]

-> 포인터 배열은 주소를 저장하는 배열이다

 

printf("address: 0x%08x\n", argv);

주소(0xbffffb84)

 

printf("address: 0x%08x\n", *argv);

주소 접근(0xbffffb84) -> 주소(0xbffffc82)

 

printf("arg: %c\n", **argv);

주소 접근(0xbffffb84) -> 주소 접근(0xbffffc82) -> 메모리의 값 (이중 포인터)

 

'System Hacking' 카테고리의 다른 글

시스템 콜을 이용한 mkdir 프로그램 작성  (0) 2018.01.28
시스템 콜(System Call)  (1) 2018.01.25
함수  (0) 2018.01.23
관계 연산(cmp) + 제어문  (0) 2018.01.19
레지스터(Register)와 사칙연산  (0) 2018.01.18