반응형

1. main 함수의 인자


 


 - 포인터 배열 : 배열인데 주소를 원소로 하는 배열

 - 배열 포인터: 포인터인데 배열을 나타내는 포인터


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

int main();


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

printf("%s\n",argv[1]); argv[1]는 주소이다

return 0;

}


argc는 입력된 argument의 갯수를 알려준다


- 어셈블리 코드


[ebp+12]는 포인터 배열의 시작주소




인자값 주소 확인하기






0xbffffb64
char *argv[]-> 0xbffffba4
0xbffffb64
[0xbffffba4]

0xbffffba4 0xbffffba8 0xbffffbac
[0xbffffc9a][0x00000000][        ][       ]
- 인자가 얼마나 들어올지 모르기 때문에 마지막은 0입니다

0xbffffc9a: ./main



[실습]: 

#>  ./a.out hello

     hello






2. 시스템 콜


- 리눅스 시스템 콜


- 윈도우즈: WIN API


커널이 함수형태로 기능을 제공하는것이 시스템 콜(200여개)


모든 리눅스 운영체제의 write systemcall 번호는 4이다



eax,4: 시스템 콜번호

ebx,1:표준 출력

ecx,msg:출력 버퍼 시작주소

edx,5d:출력할 문자열의 길이

int,80h:interupt 번호

int로만 출력할 수 있다.




exit을 이용하여 Segmentation fault (core dumped)  없애기






!유용한 명령어


1. ltrace

 -실행 프로그램에서 사용중인 C 라이브러리를 추적

2. strace


 - 실행 프로그램에서 사용중인 시스템 콜을 추적





  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기