Blog | Tag | Local | Guest | Login | Write |  RSS


이전글 [UNIX 보안 기초 -3-] 대표적인 해킹유형

벌써 한주가 지나갔습니다. 시간 참 빠르네요. 다들 중간고사도 끝났겠구..이제 새로운 시작을 해봅시다. 저는 매번 시작인것 같네요..ㅠ

이번부터는 몇가지 해킹 기법에 대해 약간 깊숙히 소개하려 합니다. 오늘은 BOF(Buffer Over Flow 공격) 인데요. 얼마전 구글폰 G1 과 구글 웹브라우저 크롬에서 버퍼 오버플로우 공격에 대한 취약성이 발견되었죠..
아무튼,, 이제 시작합니다.


C언어로 작성된 프로그램에서는 데이터에 지정된 버퍼의 크기보다 더 많은 양의 데이터가 입력이 되었을 시 프로그램이 비정상적으로 종료되었다. (매번 그 크기를 체크할 경우 수행 성능이 많이 떨어지기 때문이었죠.) 하지만 버퍼가 오버플로우 되는 순간에 사용자가 원하는 임의의 명령어를 수행시킬 수 있는 가능성이 알려지면서 문제가 되기 시작되었다.

우선 버퍼오버플로우 공격을 이해하려면 메모리와 스택의 구조에 대해 알아야 한다. 인텔(intel) x86계열 CPU를 사용하는 리눅스(Linux) OS를 기준으로 설명한다.


* Process memory organization
 - test/data/stack 영역
* stack 영역
 - LIFO (Last In First Out) 구조
 - PUSH/POP operation
 - procedure or function call (함수 호출 후 다음에 수행될 프로그램 주소저장)
 - SP(Stack Pointer), FP(Frame Pointer)(->베이스가 될 수 있는)
 - contents

paramemters, local variables, return address, previous stack frame, etc


다음의 예를 보자.     
void function(int a,int b) {

        char buffer1[5];

        char buffer2[5];

}

void main() {

        function(1,2);

}


char 형 배열을 5byte 공간으로 잡아도 실제 메모리에서는 CPU에 따라 4 or 8 or ...이렇게 잡힌다.

두번째 예를 보자.

 

결과값은 0
return address를 수정했기 때문에 x=1 이 수행되지 않고 바로 printf 문이 수행되었다.

요점 - SUID 걸린 프로그램에 BOF로 공격하여 return address를 shell 띄우는 곳으로 이동하게끔 하면 root 권한을 얻을 수 있다.




C에서는 스택 크기를 원래의 크기 보다 더 크게 공간을 잡는다. 남은 빈 공간에 우리가 직접 Shell 코드를 삽입한 뒤 return address를 쉘코드가 들어가 있는 주소로 이동하게끔 해주면 되겠다.




다음글에서 직접 Shell code를 작성하여 보겠습니다.