전제 : C코드가 기계어로 컴파일돼야 한다!
예제 소스:) 위 소스에서 string.h 헤더가 들어간 이유는 strcpy함수가 위의 헤더에 정의되어 있기 때문이다.
앞의 프로그램에서 20문자 배열은 str_a로 선언되었다. 배열은 [0]번째 부터 값이 들어간다는 것을 알고 있어야한다. 또한, 배열의 맨 마지막에는 '널 바이트' 가 들어가게 된다
하지만 20바이트중에 실질적으로 12바이트만 사용 되었다. 끝에 들어가게되는 '널바이트'는 어떤 함수가 문자열을 처리할 때 여기서 중단하라고 알리기 위한 '구획문자(Delimiter)'로 사용된다.(남은 여분의 바이트들은 쓰레기 값으로 무시된다)
이제 이 프로그램을 GDB로 살펴보자. GDB로 컴파일된 프로그램을 열고 strcpy() 호출 부분과 호출 전과 후에 중지점을 설정할 것이다.
프로그램이 실행되면 strcpy() 중지점이 결정된다. 각 중지점에서 EIP와 EIP가 가리키는 명령을 살펴 볼 것이다.
(원래 세번째 중지점의 진행 사항까지 올리려 했으나 잘려버렷다 ..)
두번째 중지점에서의 EIP주소는 strcpy()함수의 코드가 라이브러리에 있으므로 다르다.
이유는 다음과같다.
결론부터 말하자면 call 명령 때문이다.
자 그러면 생각해보자. EIP는 다음 명령을들 하나하나 읽어가면서 넘어간다. 여기서 EIP는 jmp,call등으로 인해 다른 주소로 넘어갓다고 가정하자. 하지만 돌아와야 할 방법이 필요하다. 예를 들면 우리가 집을 나갓다가 다시 돌아오기 위해서는 집의 위치(주소)를 알고 있어야 한다. 그래서 Call 명령이 사용 될때 다음 명령의 주소가 저장이된 상태로 EIP가 넘어가게 된다.
'과거의 컴퓨터 공부 > basic' 카테고리의 다른 글
메모리 세그먼트-(2) 예제 (0) | 2014.03.16 |
---|---|
메모리 세그먼트-(1)이론 (0) | 2014.03.16 |
바이너리 파일 열어보기, gdb 이용해 보기-(2) gdb 심화 (0) | 2014.03.15 |
바이너리 파일 열어보기, gdb 이용해 보기 -(1) (0) | 2014.03.14 |
기초(2) (0) | 2014.03.14 |