Information Security
main 함수의 인자 argc, argv 본문
우리는 메인 함수를 정의할 때 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 |