ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [pwnable.kr][Toddler's Bottle] 3. bof
    Wargame/pwnable.kr 2019. 7. 17. 15:00

    이번 문제는 버퍼 오버플로우에 관한 문제이다.

     

    Toddler's Bottle - bof

     

    먼저 bof와 bof.c 파일을 wget 명령어로 다운받는다.

     

    bof, bof.c 다운로드

     

    다운받은 bof.c 파일을 확인해보자.

     

    bof.c

    func 함수 내에 gets 함수가 사용된 것을 확인할 수 있다. gets 함수는 표준 입력(stdin)에서 문자열을 가져오는 함수로, 읽어들일 문자열의 길이를 지정하지 않기 때문에 버퍼 오버플로우가 발생할 수 있다.

    func 함수에서는 버퍼인 overflowme의 크기가 32 bytes이므로 이 크기를 넘어서는 문자열을 입력값으로 주면 key의 값도 조작할 수 있을 것이다.

     

    인자 key를 조작하기 위해서는 먼저 key의 위치를 알 필요가 있다.

    이를 위해 gdb를 실행시켜 func 함수를 디버깅해보았다.

     

    gdb bof

    key와 0xcafebabe를 비교하는 부분이 func+40에 위치해 있으므로, 이 부분에 브레이크 포인트를 건 다음 실행시킨다.

    (처음 bof를 다운받으면 bof 파일에 실행 권한이 없으므로, chmod 명령어로 실행 권한을 설정해주어야 한다.)

    실행하면 overflow me 문구와 함께 입력을 받는데, 버퍼의 크기가 32 bytes이므로 a를 32개 넣어보자.

     

    breakpoint까지 실행한 화면

     

    이제 esp부터 30 bytes만큼의 주소값을 확인해보자.

     

     

    a가 0xffffd31c부터 32 bytes만큼 삽입되어 있고, func 함수의 인자(key)인 0xdeadbeef는 0xffffd350에 삽입되어 있다.

    이 key를 0xcafebabe로 조작하려면, 0xdeadbeef가 있는 주소인 0xffffd350 전 부분까지 아무 문자열이나 채워넣은 후 0xcafebabe를 삽입하면 된다.

    따라서 a가 처음 들어간 부분이 0xffffd350이므로, 이 부분부터 0xffffd350 전까지 총 52 bytes 만큼의 문자열을 채워넣은 후 0xcafebabe를 넣으면 된다.

     

    0xffffd350 - 0xffffd31c = 0x34 = 52 bytes (10진수)

    (python -c 'print "a"*52 + "\xbe\xba\xfe\xca"';cat) | nc pwnable.kr 9000

     

    위와 같이 인자를 준 결과, 버퍼 오버플로우가 발생하여 쉘이 실행되었다. ls 명령어를 입력해 flag 파일이 존재하는 것을 확인하고, 해당 파일을 실행하여 flag를 얻었다.

     

    flag: daddy, I just pwned a buFFer :)

     

     

    ※ 참고

    gdb 기본 사용법: https://g-idler.tistory.com/14?category=829172

    gets vs strcpy: https://g-idler.tistory.com/26?category=829172

Designed by Tistory.