본문 바로가기

전체 글143

system()과 execl()의 차이 system()과 execl() 둘다 명령을 실행하는 함수 인데 무슨 차이가 있을까요? 일단 표면 적으로는 ls -al 같은 명령을 쓸때 system함수의 경우에는 system("ls -al") 처럼 사용하고 execl함수는 execl("/bin/ls", "ls", "-al", 0) 처럼 옵션을 다른 인자로 넘겨줘야 한다는게 차이가 있습니다. 그리고 한가지 더 보면 -> -> 위와 같이 system함수의 경우는 ls 명령어 실행 후 원래 프로그램으로 돌아와서 남아 있는 printf를 호출 합니다. 그런데 execl함수는 ls 명령어 실행 후 printf가 호출 되는 것을 볼 수 없습니다. ( execl를 호출 했을 때는 현재 프로그램이 /bin/ls라는 프로그램으로 덮어 씌워지는 것입니다. ) 따라서 e.. 2012. 5. 16.
system함수, exec계열의 함수(execl, execv, execle, execve, execlp, execvp) 먼저 system함수를 알아 보겠습니다. 원형은 int system(const char* command)이며 command에 해당하는 명령어를 수행하는 함수입니다. (반환형이 int인데 성공시 0을 반환, 실패시 -1을 리턴합니다.) system함수로 ls명령어를 실행해본 화면입니다. -> /bin/ls처럼 절대 경로말고 ls로만 입력해도 ls가 실행됩니다. (환경변수 PATH를 이용하는 듯..) 그리고 옵션을 사용할 때는 단순히 "/bin/ls -a"와 같이 해주면 됩니다. -> 이제 exec계열의 함수(execl, execv, execle, execve, execlp, execvp)에 대해서 알아 보겠습니다. 아래 그림에서 exec계열의 함수에 대해 자세히 설명해줍니다. 위의 exec함수들을 보면 e.. 2012. 5. 16.
ctors, dtors 영역 포맷스트링 버그에 이용하는 .dtors 영역에 대해서 알아 보겠습니다. GNU Compiler(gcc)는 컴파일 할 때 .ctors, .dtors 두 segment를 생성합니다. (gcc의 속성) ( ctors - constructor, dtors - destructor ) 이 두 영역의 특징은 .ctors 속성의 함수는 main() 전에 실행되고 .dtors 속성의 함수는 main() 종료 후에 실행 된다는 것입니다. 그러므로 main() 종료 후에 .dtors 속성의 함수가 실행되는 것을 이용해서 그 부분을 쉘 코드가 있는 주소 값으로 덮음으로써 쉘 코드가 실행되게 할 수 있다는 것입니다. 포맷 스트링 버그 - FSB (Format String Bug) 기본 연습하기 main() -> test_dto.. 2012. 5. 10.
PLT(Procedure Linkage Table), GOT(Global Offset Table) PLT(Procedure Linkage Table) PLT는 일종의 실제 호출 코드를 담고 있는 테이블로써 이 내용 참조를 통해 _dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어지게 됩니다.. GOT(Global Offset Table) GOT는 PLT가 참조하는 테이블로써 프로시져들의 주소를 가지고 있습니다. PLT가 어떤 외부 프로시져를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 됩니다. - printf 함수 호출이 처음일 때 [printf 함수 호출]--->[PLT로 이동]--->[GOT 참조]--->[다시PLT로 이동]--->[_dl_runtime_resolve]--->[GOT 저장 후, 실제 함수 주소로 점프] - printf 함수 호출이 처음이 아.. 2012. 5. 7.