반응형
문제분석 & 풀이
코드 분석
1. crap, check, buf[] 를 선언
2. fgets()를 통해 buf에 45바이트의 입력값을 받는다.
3. check 변수 값이 "0xdeadbeef" 이면 level15의 셸을 얻어낼 수 있다.
buf의 20바이트를 넘어선 45바이트를 입력 받고 있음으로 버퍼오버플로우가 발생할 수 있다.
다만, check 변수를 통해 셸권한을 얻어낼 수 있음으로 check의 값을 "0xdeadbeef"로 설정하도록 페이로드를 완성해 BOF를 시도하는 것이 문제의 핵심이 될 것이다.
코드를 보면 buf 상단에 check가 위치하는 것을 알 수 있다. 하지만 그 사이에 dummy가 얼마나 있을지 모르기 때문에 GDB로 직접 디버깅해서 확인해야한다.
attackme를 tmp 폴더로 복사했다.
GDB를 이용하여 attackme를 실행해, disas main 명령으로 main의 asm 코드를 확인했다. (필자는 intel 문법으로 코드를 확인하기 위해 set disassembly-flavor intel 명령을 disas main 전에 실행했다.)
○ 코드 분석
1. crap, check, buf에 대한 공간을 0x38(56)만큼 할당했다. (빨간박스)
2. "0xdeadbeef" 와 [ebp-16]의 값을 비교하는 코드가 있음으로 [ebp-16]이 check 변수의 주소임을 알 수 있다.
(파란박스)
[ebp-16]에 "0xdeadbeef"를 저장하는 방식으로 페이로드를 구성하면 된다.
C 코드와 asm 코드를 통해 유추한 스택의 모습은 다음과 같다.
사진을 토대로 check에 "0xdeadbeaf"를 넣고 나머지에는 dummy값을 넣는 형태로 페이로드를 구성해보자.
"A"*40+"\xef\xbe\xad\xde"
위와 같이 스택에 넣을 값에 대한 페이로드를 구성했다.
페이로드를 완성해보자.
(python -c 'print "A"*40+"\xef\xbe\xad\xde"';cat) | ./attackme
페이로드를 이용하여 attackme를 실행하면?
반응형