IMyoungho 2019. 3. 19. 19:53

혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.



이번문제는 Succubus에서 Nightmare로 갈 수 있는 문제이다~

생각보다 쉬운문제였다. 우선 코드를 보자

코드를 보면 PLT를 이용하라는 듯한 힌트를 주고있다.

또한 strcpy의 주소값을 ret에 덮지않으면 조건이 성립되지않아서 다음 코드로

진행할 수 없다는 것을 알 수 있다. 그러므로 우리가 구해야할 것은 일단

strcpy의 주소를 알아야한다는 것을 알 수 있다.

또한 우리는 결과적으로 쉘을 따야하기 때문에 system함수와 그 인자로 "/bin/sh"을 사용할 것이다.

이 3가지를 어떻게 사용할 수 있을까를 고민해보고 다음과 같은 Payload를 생각해냈다.



Payload = system주소 + dummy(4) + "/bin/sh"주소 + dummy(32) + strcpy주소 + dummy(4) + (ret+4)의 주소 + buffer 주소

위와 같은  Payload가 진행되면 ret로 strcpy와 실행되면서 인자로 ret+4의 주소, buffer주소를

넘겨주게된다. 그렇게되면 strcpy(&ret+4, &buffer)가 되므로

ret+4에 system("/bin/sh")이 넘어가게되고 strcpy가 끝난 뒤

system함수가 실행되면서 쉘이 따질 것이다!!

이제 필요한 것들을 구해보도록 하자~


System함수주소와 "/bin/sh"의 주소를 구하는 법은 지겹도록 해봤으니 생략하도록 하겠다.

Sytem함수의 주소 : 0x40058AE0

"/bin/sh"의 주소 : 0x400FBFF9



이번에는 strcpy의 주소를 구해보도록 하겠다.



지금까지 구한 것들을 토대로 Payload를 구성해보았다.

ret+4의 주소와 buffer의 주소는 일시적으로 0xffffffff으로 진행하였고

당연히 Segmentation fault가 일어났다. 그래서 dump된 core파일을 확인해보았다.



메모리를 보니 우리가 넣어준 system함수의 주소가 보인다. 

그러므로 buffer의 시작주소는 0xbffffa80이라는 것을 알 수 있었다. 


또한 nightmare.c의 코드를 봤을 때 마지막에 있던 memset에 의해

"AAAA"가 ret+4에 들어가 있다는것을 알고 있으므로

0xbffffab0가 ret + 4의 주소라는 것도 알 수 있었다. 

그러므로 Payload에 0xffffffff으로 채워넣었던 부분을 위에서 구한 주소들로 바꾸어 진행했다.



쉘이 따졌다~~



원본에서도 진행하였고 역시 쉘이 따졌다~~



다음 단계로~






반응형