표튜터와 함께하는 Pwnable/HackCTF Write-up

[HackCTF] 내 버퍼가 흘러넘친다!!! Write-up

IMyoungho 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를 딸 수 있었다~~


반응형