반응형


전제 : 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가 넘어가게 된다.




반응형
,