Buffer Overflow
먼저 BOF는 말 그대로 Buffer (버퍼가) Overflow (넘치다)
버퍼가 넘친다는 말입니다.
프로그래머의 실수로 인해 버퍼가 할당받은 공간에 크기 제한을 하지 않고 값들을 집어넣어 할당받은 공간보다 더 값을 넣을 수 있는 취약점입니다.
쉽게 말해서 buf[10]이라는 배열을 만들었다면,
이 배열은 총 10개의 공간을 가지게 됩니다.
하지만 buf에 10개의 값을 넣는게 아닌 11개, 12개 혹은 그 이상의 값들을 크기를 확인하지 않고 마구잡이로 넣어서 BOF 취약점이 터지게 되는 것이죠 :D
먼저 BOF에 들어가기 앞서 스택 구조와 프롤로그 에필로그에 대해 알아보도록 하겠습니다.
Hello STACK!
이 블루스택 프로그램을 말하는 걸까요?
오...아쉽게도 아이콘은 비슷했지만 이 프로그램을 말하는 것은 아니였습니다.
음, 프로그래밍을 좀 해보셨다면 자료구조에서 스택을 분명히 들어보셨을겁니다.
스택은 선입후출 FILO(First In Last Out), 후입선출 LIFO(Last In First Out) 구조를 가지고 있으며, 쉽게 말해 접시와 같다고 흔히들 비교를 하십니다.
이렇게 처음에 쌓인 것이 나중에 나온다 해서 접시, 책 등등으로 쉽게 비교를 하시며 설명을 하십니다.
Open Program in GDB!
앗, 먼저 저희는 프롤로그와 에필로그에 대한 지식이 필요할 것 같습니다.
일단 여기서 뒤로 하고 프롤로그 에필로그에 대해 알아보도록 하겠습니다.
Stack Prologue&Epilogue
Prologue
Epilogue
leave
ret
먼저 프롤로그가 시작됩니다.
sub esp, 0x20은 스택을 사용하기 위해 공간을 확보하는 것입니다.
그 뒤에는 scanf가 실행되는데요.
위에 mov되는 것은 저희가 넘겨준 인자들입니다.
그렇다면 버퍼의 주소는 0xffffd6e6이겠네요.
그리고 실제로 버퍼 주소가 맞는 것을 확인할 수 있었습니다.
그렇다면 이번에는 크기를 제한하지 않고 버퍼보다 많은 값들을 넘겨줘보겠습니다.
띠용 eip가 주작이 되었습니다.
이제 여기서 알아야될 것은 SFP와 RET입니다!
위와 같이 생겨먹었습니다.
dummy는 gcc 2.9.6? 2.9.5? 음...아무튼 저 근처대의 버전에서 더미가 추가되었습니다.
SFP는 이전 함수의 EBP를 저장해두는 장소입니다.
해당 함수가 끝이 나서 함수를 빠져나와야되는데, 돌아갈 주소를 다시 찾아가기 위한 저장소(?)입니다.
RET은 SFP와 마찬가지로 이전 함수로 돌아가기 위한 주소를 가지고 있습니다.
아무튼, 위와 같은 구조를 가지고 있었기에, buf와 dummy를 넘기고 RET까지 도달하였기에 0x62626262으로 이동하게 된 것 입니다.
이러한 방법으로 RET을 의도적으로 원하는 주소로 이동시킬 수 있기 때문에
프로그램을 해커가 원하는 흐름으로 바꿀 수 있게 되는 것 입니다.
BOF는 해킹의 꽃이라고 볼 수도 있을 것 같습니다!
감사합니다.
'0x20 Security > 0x21 System' 카테고리의 다른 글
Format String Bug (FSB) (0) | 2016.12.01 |
---|---|
Save Frame Pointer Overwrite (SFO) (0) | 2016.07.25 |
About LD_PRELOAD (0) | 2016.07.20 |
Use After Free (UAF) (1) | 2016.07.13 |
How main() is executed on linux (2) | 2016.07.04 |