ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOB] Succubus -> Nightmare Write-up
    표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 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으로 채워넣었던 부분을 위에서 구한 주소들로 바꾸어 진행했다.



    쉘이 따졌다~~



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



    다음 단계로~






    반응형

    댓글

Designed by Tistory.