ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF] Poet Write-up
    표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 29. 00:45

    이번 문제는 Poet이다. 생각보다 쉬웠다.




     NX만 걸려있었고 RELRO는 Partial이었다.

    힙, 스택, 데이터 영역에 실행권한이 없었고

    got overwrite는 가능하다는 걸 알 수 있었다.




    문제를 실행시켜보도록 하겠다.

    뭔가 값을 입력받고나서 저자가 누구인지 물어본다.

    총 2번의 입력을 사용자로부터 받고 있었고

    출력된 문자열을 보니 1000000점을 

    획득해야한다는 것을 알 수 있었다.




    이번에는 IDA를 이용해서 코드를 보도록 하겠다.

    main함수를 보니 총 4가지의 함수가 돌고 있었고

    각각의 함수를 살펴보기로 했다. 또한 dowrd 6024E0이라는

    변수는 1000000이여야 while문을 탈출하고 reward 함수를

    호출하는 것으로 보아 점수에 해당하는 변수임을 알 수 있었다.





    첫 번째로 호출되는 get_poem 함수는 poem변수에

    입력을 받고 아까 위에서 봤던 점수를 뜻하는 dword_6024E0을

    0으로 초기화 시키고 있었다.





    두 번째로 호출되는 함수인 get_author을 보면

    딱히 별 건없고 unk_6024A0에 gets로 입력을 받고 있었다.






    세 번째로 호출되는 rate_poem함수를 보면 특정 문자열을

    입력했을 시 100점씩 점수가 오른다는 것을 알 수 있었다.





    마지막으로 호출되는 reward 함수는 while문을 탈출해야만

    실행되는데 내용은 flag를 보여주도록 되어있었다.




    지금까지 진행한 것으로 생각해보았을 때 알 수 있던 것은

    점수를 10000000을 맞아야 한다는 것과 이 점수를 저장하는

    변수가 존재한다는 것이고 이 변수는 고정주소를 가진 bss영역에

    존재하고 있는 전역변수로 선언되었다 라는 것이다. 또한

    두 번째로 호출된 함수 get_author에서 입력을 받는 변수인

    unk_6024A0 또한 bss영역에 속하는 변수임을 알 수 있었다.

    그렇다면 우리는 이 점들을 이용해서 문제를 풀어야한다.




    우리의 목적은 결과적으로 점수이기 때문에

    사용자가 함수에서 원하는 문자열을 입력하였을 때

    100점을 얻게되는 부분을 우선적으로 확인해보았다.

    rate_poem 함수에서 strcmp하는 조건문 다음에

    조건과 일치할 시 점수가 100점 상승하는 부분인데

    rip+0x201bAE에 존재하는 값을 100점을 올리는 것으로 보아

    이 부분이 dword_6024E0라는 것을 알 수 있었고 그 주소는

    rip + 0x201bAE는 0x6024E0이라는 것을 알 수 있었다.



    이전에 실행했던 get_author함수에서 우리는 두 번째 입력이

    가능했는데 그 부분의 변수 또한 전역변수에 값을 입력하는

    gets함수가 존재했었다. 그러므로 그 부분을 다시 확인해보았다.




    이 함수에서 호출되는 gets에 "aaaa"를 입력하였는데

    이 값이 저장되는 변수인 전역변수 unk_6024A0이

    주소 0x6024A0라는 것을 알 수 있었다. 그러므로

    우리는 여기서 호출되는 gets가 BOF를 일으킬 수 있음을

    이용하여 점수를 의미하는 변수 dword_6024E0 값을

    1000000으로 만들어주면 된다는 것을 알 수 있었다.

    두 변수간의 거리는 64개임을 확인하였고  그 다음 부분을

    덮어쓰게되면 우리는 점수를 조작할 수 있을 것이다.



    그럼 이제 Payload를 구성해보도록 하겠다.

    나는 sleep로 100점을 얻고 시작하고 싶어서

    이런식으로 진행하였다.ㅎㅎ 999900인 상태에서

    rate_poem이 호출되면 sleep을 입력했으므로

    100을 더해줘 1000000이 될 것이다ㅎㅎ 이런식으로

    Payload를 구성해서 진행하게되면~




    while문을 탈출하여 reward 함수가 실행되면서

    FLAG를 볼 수 있게 된다~

    반응형

    '표튜터와 함께하는 Pwnable > HackCTF Write-up' 카테고리의 다른 글

    [HackCTF] g++ pwn Write-up  (0) 2019.04.30
    [HackCTF] 1996 Write-up  (0) 2019.04.29
    [HackCTF] Look at me Write-up  (0) 2019.04.26
    [HackCTF] Gift Write-up  (0) 2019.04.25
    [HackCTF] ROP Write-up  (0) 2019.04.24

    댓글

Designed by Tistory.