Phantom

CodeGate 2014 Nuclear WriteUp 본문

Pwnable/WriteUp

CodeGate 2014 Nuclear WriteUp

Ph4nt0m_ 2017. 7. 18. 16:31
반응형
    1. 개요
      이번 문제는 ROP문제 3대장중 2번째인 nuclear다.
      저번 ropasaurusrex가 아주 심플한 ROP였다면 이번 문제는 함수Libc를 leak해야 한다.
    2. 문제 내용 및 분석



      1129 port로 연결하고 accept후 fork가 되면 subroutine으로 이동하게 된다.




      로컬의 THIS_IS_NOT_KEY_JUST_PASSCODE를 stream에 저장하고 fread로 s에 읽어온다.




      각 명령어를 입력하고 target을 입력하면 Latitude/Longitude를 입력한다.


      여기서 이 else문을 이용하여 v5, v4를 지나서 char s에 있는 pascode를 leak한다.

      그리고 launch와 leak한 passcode를 입력하여 thread를 생성하고 newthreadroutine()으로 이동한다.


      thread를 생성하고 start_routine으로 이동하게 되는데


      여기서 BOF 취약점이 일어나게 된다.

      정상 프로그램 흐름이라면 무조건 여기서 Good Luck라는 Fxxk을 날려주면서 start_routine은 종료를 하고 아래 while문으로 들어가는데


      100초를 세고 nuclear_send를 return한다.



      펑, 프로그램 종료.

    3. 문제분석

      자..이제 분석을 해보자면 우선 파일은 

       
      OS는 Ubuntu 16.04 64bit이며 NX가 걸려 있고 Canary는 없다.

      이번에도 ROP문제이긴한데 음...왜 ROP문제인지는 잘 모르겠다. 단지 NX와 ASLR이 걸려있으니 가장 편한 수단을  쓰는걸까?
      뭐 암튼 사용 가능한 함수는 


      이렇게 정도 있다. 실제로 쓸 입력과 출력함수는 recv와 send정도밖에 안보인다.

      음...짧게 정리를 하자면 이렇다.

      1. PASSCODE leak
      2. ROP를 위한 Libc Leak
      3. ROP Exploit

      우선 passcode를 leak 해야한다.



      아까 위의 사진을 보면 scanf 함수에서는 길이를 체크하지 않는다 그리고 v5변수가 있다.
      passcode가 있는 s변수와 v5가 s1으로 저장되므로 s1변수간의 거리는 228h-20h = 208h = 520byte이다.
      v4 v5를 무사히 지나 passcode부분까지 닿게 되면 passcode를 출력해 줄 것이다.


      passcode는 얻었고 이제 ROP 에 사용할 함수를 Leak만 해주면 된다.



      각 Offset은 libc-database나 readelf -s로 오프셋을 찾는다



      그래서 leak한 libc의 실행결과는





      아직 왜 오프셋이 출력에 따라 값이 변하는지는 모르겠다.

      이제 ROP만 하면 된다.




      익스플로잇 성공 전체 소스는 여기에서 볼 수 있다.
반응형

'Pwnable > WriteUp' 카테고리의 다른 글

Start  (0) 2022.07.03
Simple login  (0) 2019.06.06
1 Plaid CTF 2013 - ropasaurusrex  (0) 2017.04.26
ActiveX Heap Spray_COMRaider Fuzzing POC  (2) 2016.05.16
붉은별 OS 3.0 local privilege escalation POC  (0) 2016.05.09
Comments