ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF] RTL_Wolrd Write-up
    표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 21. 17:33

    이번 문제는 RTL_World이다.

    제목에서 볼 수 있듯이 RTL을 이용해야 할 것만 같다ㅎㅎ

    우선 프로그램을 실행해보았다.




    뭔가 돈을 벌어서 Binary Boss를 죽이는 게임인 것 같고

    돈을 벌 수도 있고 돈을 통해 Shell Sword와 System Armor을

    구입할 수도 있는 것 같다. 우리가 입력할 수 있는 부분은

    메뉴선택과 Binary Boss를 Kill하기위한 Attack 부분이다.

    그러므로 이 부분을 이용하여 공격을 진행하면 될 것 같다.




    소스코드를 보도록 하자~

    코드를 보게되면 우리가 입력할 수 있는 버퍼가 보이고 





    아래쪽 즉 Binary Boss를 kill 하기 위한 부분을 보면 read함수를 이용해서 입력을

    받고 있는데 이 부분에서 BOF를 일으킬 수가 있게된다.

    버퍼보다 더 큰 크기를 입력 할 수 있기 때문이다.




    Mitigation 역시 예상대로 NX가 걸려있다. 그러므로 우리는 라이브러리에 있는

    실행권한을 이용해서 공격을 하면 될 것이다~ 예상과 딱딱 들어맞는다ㅎㅎ





    그렇다면 우리가 어떤 외부라이브러리 함수를 사용할까??

    보통 이런 경우 대부분 System함수를 사용하는데 마침 System함수가

    존재한다. 그러므로 system함수와 인자로 사용될 "/bin/sh" 그리고

    ret값을 알아야한다. ret값을 구해서 system함수를 실행시키고 인자로

    "/bin/sh"을 넘겨주면 된다!! 이제부터 하나씩 구해보도록 하자~



    인자로 사용될 "/bin/sh"은 이런식으로 objdump를 이용해서 구할 수 있다.



    system( )함수의 경우 IDA를 켜거나 gdb에서 info func을 이용해서 찾을 수 있다.

    (그 외에 여러가지 방법이 존재하지만 편한 걸 사용하자)



    < IDA를 이용하면 바로 보입니다^^ >

    이런식으로 필요한 것들을 모두 찾았다.



    4개의 "a"을 입력하였고 144개의 dummy 값 뒤에 ret가 있음을 확인하였다.

    이제 필요한 것을 다 구했으니 Payload를 구성해보자


    Payload는 다음과 같다~ 

    우리가 구한 system함수의 주소와 "/bin/sh"의 주소를 이용하여 RTL을

    진행해주면된다. 중간에 "a" 4개를 주는 이유는 ret인데 이 문제에서는

    굳이 신경쓸 필요가 없어서 dummy값을 주었다.




    위와 같이 진행하게 되면 이런 식으로 FLAG를 볼 수 있다~


    반응형

    댓글

Designed by Tistory.