ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Black Jack Write-up
    표튜터와 함께하는 Pwnable/Pwnable.kr Write-up 2019.04.15 16:23

    이번 문제는 Black Jack이다.


    힌트를 보았더니 돈이 그냥 많으면 준단다. 백만장자한테 준다는데..


    코드를 보도록 하자.

    음... 길다... 길어서 다 보여주기 힘들다.

    문제에 링크가 있으니 참고하길 바란다.



    일단 프로그램을 실행해보도록 하겠다.

    블랙잭 게임이 뭔지는 잘모르지만 돈을 배팅하고

    배팅한 돈의 일정한 비율로 돈을 따는 게임인 것 같다.


    백만장자한테 FLAG를 준다고 했으니 돈에 관련된

    코드에 분명히 취약점이 있을 것 같았다.



    그래서 우선적으로 눈에보이는 Bet에 대해서 검색을 해보았다.

    이 함수가 바로 배팅관련 함수이다. 이름이 그냥 betting( ) !!

    우리가 배팅하고 싶은 금액을 입력할 수가 있다. 하지만 현재 가지고 있는

    cash보다 배팅 금액이 클 경우 너는 가진돈보다 많은 돈을 배팅했다며

    메시지를 출력하는데 그 다음 또다시 입력을 받고 바로 bet을 return해버린다.

    그 외의 경우에는 그냥 bet을 return한다.

    그러므로 그냥 큰 값을 입력해버리면 될 것이다. 





    리턴된 bet값은 승리 시에 cash에 +되고 패배 시에는 -된다.

    이제 위에서 생각한대로 한번 진행해보도록 하겠다.




    7을 그냥 있는대로 넣었다ㅎㅎ




    Hit 할래? Stay 할래?라고 물었다. 당연히 H~~~

    Hit는 카드를 더 받는것이고 Stay는 안받는다는 의미라고한다.

    더 줘라고 했더니 오잉? 이겨부렸다~~





    돈이 나에게 돌아왔는데 거금이 들어왔고 나는 백만장자가 되었다.

    덤으로 FLAG값도 주었다~~




    이번에는 패배해보았다~ bet의 자료형(int) 범위보다 큰 수를 넣었더니

    if문이 그냥 생략되었다. 하지만 뭐 그 외의 경우도

    bet를 return하기 때문에 경고문 출력없이 진행되었고

    (이 부분은 범위보다 작으면 무조건 출력하지만 클 경우에는

    출력할 때도 있고 안할 때도 있었음)


    역시 돈과 FLAG를 준다~~

    (참고로 음수 값을 채워넣어도 가능하다.

    그 이유는 첫 번째로 수식에 있는데 패배할 경우

    bet에 - 되므로 --가 되어 +가 된다. 두 번째 이유는

    범위가 커질 때 발생한다.

    int 형의 최소값인 -2147483648에 -1을 하게되면 2147483647이 된다.



    이러한 현상을 언더플로우 (반대는 오버플로우)라고 하는데 이를 이용함으로써

    음수를 사용해서 승리하게 되더라도 FLAG를 볼 수 있다.

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

    Input2 Write-up  (0) 2019.04.17
    Blukat Write-up  (0) 2019.04.15
    Black Jack Write-up  (0) 2019.04.15
    Cmd1 Write-up  (0) 2019.04.04
    Lotto Write-up  (0) 2019.04.03
    Leg Write-up  (0) 2019.04.02

    댓글 0

Designed by Tistory.