IMyoungho 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를 볼 수 있다~


반응형