반응형

[프로그램 동작]

retlib.c

Badfile을 읽어서 bof의 인자로 전달해준다. Bof 함수는 badfile을 읽고 buffer에 쓰는데 경계체크를 하지 않으므로, 버퍼의 크기를 초과해서 쓰게 된다.

이 곳이 retlib파일의 취약점이 된다.

따라서 버퍼 오버플로우를 일으켜 bof함수의 리턴주소를 system함수로 조작할 수 있게 된다.

 

exploit.c

Exploitbadfile을 열고 buf를 쓴다. Retlibbuffer over flow 취약점을 이용하므로, retlibbof 함수의 return 주소에 system 함수의 주소를 넣고, 인자로 “/bin/sh”을 준다.

그리고 return 주소로 exit를 준다. 따라서 bof함수가 정상적으로 return 되지 않고 system 함수를 호출하고 인자로 “/bin/sh”을 넘겨주어 shell이 실행되게 된다.

RetlibsetUID가 설정되어있고, Non-executable stack이므로 code reuse 공격을 사용하여 libcsystem함수를 이용하여 /bin/shroot권한으로 실행한다.

 

 

Retlib.c bof함수를 disassemble하여 보면 버퍼 위로 더미데이터가 8바이트가 있는 것을 알 수 있고, 따라서 bof함수의 리턴주소의 위치는 buffer[24]임을 알 수 있다.

따라서 리턴 주소를 조작할 수 있게 된다.

그리고 fread하기전 인자들을 전달하는 것을 볼 수 있다.

[ebp+0x8] =badfile의 주소, 0x12c = 300, 0x1 = sizeof(char), [ebp-0x14] = buffer의 시작주소를 전달하는 것을 볼 수 있다.

buffer[24]의 위치는 원래 return address이므로 여기에 system의 주소를 넣고 그 위(buffer[28]) exit의 주소, 그 위(buffer[32]) /bin/sh의 주소를 넣어준다.

 

gdb에서 printfind 함수를 이용해 system함수의 위치는 0xb7e42da0, exit 함수의 위치는 0xb7e369d0, “/bin/sh”의 위치는 0xb7f6382b임을 알 수 있다. 따라서 다음과 같이 exploit.c를 작성하였다.

 

Exploit을 실행하고 retlib을 실행하면 스택이 다음과 같이 바뀌게 된다.

Bof의 리턴주소 = system함수의 주소 -> system함수 호출

Bof 리턴주소 위 4byte = exit 함수의 주소 -> 호출된 system 함수의 리턴 주소가 된다.

Bof 리턴주소 위 8byte = /bin/sh의 주소 -> 호출된 system 함수의 인자로 들어가게된다.

 

retlibbof에서 오버플로우가 발생하고 위와 같이 덮여 쓰여지게 된다.

Non executable stack이라 하더라도 executable code region system함수를 불러오므로 shell을 실행할 수 있게 된다.

이 파일은 setuid bit가 설정되어있고 ownerroot이므로 root의 권한으로 실행되게 된다.

따라서 ruidseed이지만 euid root임을 알 수 있다.

 

[취약점 보완]

컴파일러 수준에서 스택 쉴드를 사용한다. Shadow 스택을 사용하여 함수가 리턴될 때 call stack, shadow stack을 비교하여 일치하지 않을 경우 종료하게 한다.

 

- ASLR을 이용하여 주소를 랜덤화 한다.

 

- 스택 가드기법(-fstack-protector)를 사용하여 스택 변수와 스택 프레임 포인터 사이에 보호값을 넣는다.

 

- 프로그래머가 명시적으로 복사할 크기를 지정해주어 버퍼 오버 플로우가 일어나지 않게 한다.

fread(buffer, sizeof(char), 12, badfile)을 하여 12바이트만 읽어오게 한다.

또는 버퍼의 크기를 badfile의 크기보다 크게 설정해준다.

 

- 코드로 리턴주소와 버퍼 사이에 guard를 설정하여 값이 변경되었는지 확인한다.

이 방법은 공격을 막을 순 있으나, bof 스택 내의 버퍼와 리턴주소 사이를 건드려야하므로, 정상적으로 “Returned Properly”를 출력하지 않고 프로그램이 종료된다.

 

- DashsetUID 프로세스 내에서 권한이 내려가듯 위험한 코드가 실행되기전 권한을 낮추어 버린다.

이 방법도 공격을 막을 순 있으나 bof 함수를 실행을 막지는 못하므로 정상작동하진 않는다.

728x90
반응형
블로그 이미지

아상관없어

,