ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF] 내 버퍼가 흘러넘친다!!! Write-up
    표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 18. 02:12


    이번에 풀 문제는 "내 버퍼가 흘러넘친다!!!" 이다.




    문제를 실행시켜보도록 하자~~

    Name과 input이 출력되고 두 번 입력을 받고 있다.



    이번에는 IDA로 코드를 살펴보았다.

    read함수와 gets함수로 입력을 받고 있다는 것을 알 수 있다.

    read 함수로 입력을 받는 name의 경우 전역변수이므로 BSS영역에 존재한다. 


    gets함수로 S 버퍼에 입력을 받기 때문에 길이제한이

    없으므로 이곳에서도 충분히 버퍼오버플로우를 일으킬 수 있다.


    첫 번째로 시도한 방법의 Payload는 다음과 같다.


    S 버퍼의 크기가 존재함에도 gets함수를 사용했기 때문에

    s와 sfp의 크기를 더미값으로 채우고 ret를 버퍼 s 다음의 주소를 준다.

    그 다음 쉘코드를 넣는 방식으로 payload를 구성하였다.




    첫 번째 입력 payload = dummy..

    두 번째 입력 payload = dummy(24) + ret(shellcode addr) + shellcode




    < Payload >

    버퍼의 주소는 동적디버깅을 해보니 기존과 달라져서 저렇게 써준것이다.



    < 디버깅 >




    하지만 이 방법은 localhost에서는 성공하였으나



    직접 서버에 시도할 때는 실패하였다. 흠... 왜일까???(막아놓은 것인가?? 아마 ASLR일 것 같다.)







    그래서 다른 방법을 사용해보기로 하였다. 그것은 바로 name을 이용하는 것이였다.

    name은 전역변수로 초기화값이 없어서 bss영역에 존재하며 고정주소 영역을 사용하고 있었다.

    name에 쉘코드를 넣어놓고 ret값으로 name의 주소를 주는 것이였다.


    첫 번째 입력 payload = shellcode

    두 번째 입력 payload = dummy(24) + ret(name addr(shellcode가 들어있음))


    read함수로 name을 입력받기 때문에 저 주소가 name이라는 것을

    알 수 있었다. 또한 크기 0x32(50)도 넘어가는 것을 확인하였다.




    이제 ret 위치를 구해보자~~

    "b"를 20개 넣어보았다. ret값이 0xffffd0dc이므로 우리는 저 값을

    name의 주소로 바꾸어주면 된다.~



    < payload >




    FLAG를 딸 수 있었다~~


    반응형

    댓글

Designed by Tistory.