본문 바로가기
공부정리/햌

BOF 정리

by stdlib.h 2016. 7. 17.

BOF란?


Buffer Overflow 의 약자로 버퍼보다 큰 데이터를 입력했을때 발생하는 취약점이다.


원리를 설명하자면, 공격자가 버퍼를 넘어서는 크기로 입력하여 메모리 임의의 위치에 원하는 값을 써넣는 기법이다.


예를들면 버퍼에 쉘코드를 넣고 ret에 버퍼의 주소를 쓸 수도 있다.


pwnable.kr 의 bof 문제를 풀어보겠다.



pwnable.kr 에서 받아온 bof.c 의 내용이다.


메인함수에서 func를 호출하고 인자로 0xdeadbeef를 넘겨주고,


우리가 gets로 입력하여 인자로 넘긴 key의 값을 cafebabe로 변조하면 풀리는 문제인 것 같다. 


bof 를 gdb로 열어보겠다.



main을 디스어셈블한 코드인데, 딱히 별 것 없고 func를 호출하는 것 같다.



func를 디스어셈블 한 코드이다.


0x48만큼의 공간을 확보하고 어쩌고 저쩌고 하는데, 결국 


gets를 호출하는 부분은 func + 35 부분이다.


인자로 넘겨주는 부분을 보니 , 0x2c부분인데, 이 부분이 버퍼의 시작일 것이다.


0x48 - 0x2c = 44


그럼 buffer + dummy = 44 바이트 일 것이다.

그다음 sfp, ret 이 각각 4바이트씩 있고, key가 있을테니 


페이로드는 'A' * 52 + "\xbe\xba\xfe\xca" 일 것이다.


직접 해보겠다.




성공적으로 쉘이 따졌다.