2015. 4. 23. 14:27 :: 시스템 보안
[Message] gdb를 이용한 버퍼 오버플로우 실습3

http//pwnable.kr/?p=probs 사이트에 있는 bof[PT5] 문제를 풀이합니다.

실행환경은 칼리리눅스입니다.

 

1. 소스코드 실행

1) 다운로드

위 사이트에 접속하여 bof PT5 실행파일을 다운로드합니다.

 

2) 스택고정

랜덤스택을 disable하기 위해 아래와 같은 명령어를 입력합니다.

- echo 0 > /proc/sys/kernel/randomize_va_space

 

3) GDB 실행

-q 옵션을 이용하여 gdb를 실행합니다.

- set disassembly-flavor intel 옵션을 이용하여 인텔 문법으로 설정하고 main을 살펴봅니다.

main함수에 브레이크를 걸고 실행을 한번 해야 함수명들이 보입니다.

 

main함수

main함수에서는  <func> 함수와 인자값으로 들어가는 0xdeadbeef 변수가 보입니다.

 

func함수

 

 

2. 분석

1) main

main에서는 복잡한 내용없이 0xdeafbeef를 인자로 넣고 func 함수를 실행합니다.

 

1) func

<puts>

func 함수에서 첫번째 호출되는 함수는 <puts> 함수입니다.

 

들어가는 매개변수를 확인해보면 "overflow me : " 라고 되어있습니다.

 

<gets>

func함수에서 두번째 호출되는 함수는 <gets> 함수입니다.

[ebp-0x2c] 버퍼에 gets로 받은 값을 저장합니다.

 

<비교구문>

cmp를 이용하여 [ebp+0x08], 즉 함수의 첫번째 전달인자와 0xcafebabe를 비교합니다.

첫번째 인자는 0xdeadbeef이므로, 값을 변경하지 않는이상 <func_63>으로 점프합니다.

점프후에 0x800007a3값을 출력하고 끝냅니다.

해당 값은 아래와 같습니다.

만약 값이 0xcafebabe일 경우, system 함수를 호출하고 종료하게됩니다.

 system 함수에 들어가는 인자는 아래와 같습니다.

 

 

3. 풀이방법

0xdeedbeef 값을 0xcafebabe로 바꿔야 하므로,

입력하는 버퍼를 이용하여 RETN 아래에 위치한 매개변수를 0xcafebabe로 덮어쓰면 됩니다. (아래그림 참고)

따라서 쓰레기값 문자열 "A"를 52개를 넣고, 끝부분에 "0xcafebabe"를 넣습니다.

4. 0xdeadbeef 덮어쓰기

1) 사용할 코드

파이썬으로 "A"문자열 52개를 만들고, 뒷부분에 "0xcafebabe"를 입력합니다.

argvs가 인자가 아니므로, 파이프라인으로 bof파일에 입력값을 넣어줍니다.

(python -c 'print "A"*52 + "\xbe\xba\xfe\xca"' ; cat) | ./bof

 

2) 실행결과

 

 

posted by Red_Message