간단한 Buffer Over Flow(bof) 문제입니다.
필요한 사전지식
1. Redhat에서 동작하는 바이너리들의 메모리 관리에 대한 이해와 활용
2. C언어 fgets, strncmp 명령어에 대한 심층적 이해
3. gdb 디버거의 사용법과 이해
4. Buffer Over Flow(bof)의 이해와 활용
읽으면 좋은 자료
"해커 지망자들이 알아야 할 Buffer Overflow Attack의 기초", Wowhacker 달고나(Dalgona)님 저
-> 하단 첨부
"리버싱 [리버스 엔지니어링 비밀을 파헤치다]", 엘다드 에일람 저
-> http://acornpub.co.kr/book/reversing
"리버스 엔지니어링 바이블", 강병탁 저
-> https://wikibook.co.kr/reverse-engineering-bible/
"리버싱 핵심원리", 이승원 저
-> https://www.yes24.com/Product/Goods/7529742
더보기
우선 소스코드를 분석 해 봅시다.
변수 "buf2", "buf"가 있으며, 각각 10의 사이즈를 가지고 있습니다.
그런데, fgets로 40문자까지 표준입력방식으로 "buf" 변수에 입력을 받게 되어 있네요.
여기서 문제가 발생합니다.
buf변수는 사이즈가 10인데 40사이즈의 문자를 입력받게 되어 있다는 점이 문제입니다.
fgets는 buf변수의 시작 메모리주소값을 받게되고, 40사이즈만큼 입력을 받아서 메모리에 작성하게 됩니다.
즉, buf변수의 사이즈를 초과해서 다른 변수의 정보를 덮어쓰게 되겠지요.
buf2가 buf보다 먼저 선언되어 있으니, 메모리 구조가 [buf 10] [ ??? ] [ buf2 10] 로 구성되어 있을 것 입니다.
이제, ???의 사이즈를 구하면 buf2 변수에 go를 입력할 수 있습니다.
/usr/bin/bof와 똑같은 바이너리를 만들어 봅시다.
해당 바이너리를 gdb로 열어서 확인 해 보니, 둘의 차이는 16인 것으로 확인됩니다.
그럼, bof 바이너리를 실행했을 때 It can be overflow라는 입력이 나왔을 경우 아무 문자로 16을 채우고 "go"를 입력하면 buf2 변수에 go가 입력됩니다.
level10의쉘을 잘 실행한 것을 볼 수 있습니다.
my-pass를 실행하면? "interesting to hack!"이라는 비밀번호를 주네요.
'Wargame > Hacker School FTZ' 카테고리의 다른 글
HackerSchool FTZ - Level10 (0) | 2015.11.22 |
---|---|
HackerSchool FTZ - Level8 (0) | 2015.11.21 |
HackerSchool FTZ - Level7 (0) | 2015.11.21 |
HackerSchool FTZ - Level6 (0) | 2015.11.21 |
HackerSchool FTZ - Level5 (0) | 2015.11.21 |