BOF(Buffer Over Flow)
말 그대로 버퍼를 넘는다-라는 뜻입니다.
버퍼라는 말은 데이터를 담아두는 곳입니다.
(자세한 것 : https://ko.wikipedia.org/wiki/%EB%B2%84%ED%8D%BC_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99))
BOF는 메모리 공간을 쓸 수 있는 상황에서 ret값이나 흐름을 공격자가 원하는 방향으로 바꾸는 기법이다.
만약 스택의 공간이 다음과 같이 할당이 되어 있는 상황에서 scanf나 gets등과 같이 메모리에 값을 넣을 수 있는 함수가 프로그램에 쓰인다면 이것을 이용하여 RET부분을 바꿔준다.
이 기법이 바로 BOF이다. 이러한 원리는 rtl과 rtl-chain, rop, rtdl등의 기법들이 공통적으로 가지고 있는 특성이다(BOF의 개념이 다른 기법들의 기초개념이라는 의미이다). 이러한 기법들의 특징은 메모리에 값을 입력하거나 쓸 수 있어야 한다는 특징이 있다.
해커스쿨 문제를 통한 bof개념
위의 소스를 보면 char형 10개짜리 배열을 2개를 선언하고 두번째 선언한 배열에다가 fgets으로 입력을 한다. 그리고 if문으로 buf2 2바이트가 문자열"go"인지 비교하고 참이면 uid,gid가 3010인 쉘을 준다.
파란색부분을 보면 0x28바이트 정도 ebp에서 빼준다(이 영역을 변수로 쓴다는 소리인 것 같다). 그리고 주황색부분을 보면 1이 buf이고 2가 fgets에 2번째 인자 3은 3번째 인자인 stdin이다. 여기서 주목해야할 부분은 ebp-40부터 데이터를 쓴다는 점이다.
위의 왼쪽을 보면 epb-24부분을 go랑 비교하는 것을 알 수 있다. 오른쪽부분은 aaaa를 fgets으로 입력받았을때의 모습이다. 이때 eax-0x10부분에 aaaa가 있는 것이 확인 되었으므로 aaaa를 총 4번 입력하고(a말고 다른 것을 입력해도 된다.) go를 입력하면 쉘을 얻을 수 있게 된다.
이처럼 buf의 버퍼를 넘어 buf2에 영향을 준 것이 BOF의 개념이다.
많이 부족한 내용 및 설명이었지만 읽어주셔서 감사합니다. 그리고 오류 및 오타가 있으면 바로바로 알려주시면 더욱 감사합니다.