My Study/System

Stack Corruption

1.Stack Corruption란?

Buffer Overflow 기법이 두가지로 나뉘게 되었는데 그 중 하나가 Stack Corruption 이다. Stack Corruption는 단어 그대로 스텍을 변형 하여 공격하는 기법이다.


2. Stack Corruption 코드 확인

 아주 간단히 만든 코드니 한 줄씩 봐확인해보자.

 


#include<stdio.h>


int main(int argc, char *argv[1])

{
    char buf[128];

//128개의 버퍼를 받는다

strcpy(buf, argv[1]);

// 첫번째 인자를 buf에 넣는다.

printf("buf %s\n", buf);

// 복사한 인자를 출력한다.

return 0;

}


void secret()

{
    system("/bin/ls");

//메인 함수에서는 불러오지 못하는 영역으로 Stack Overflow를 사용하여 이 함수를 출력해보겠다.

}


이 함수를 컴파일 할 때 아래와 같이 옵션을 넣어준다.


gcc -fno-stack-protector -mpreferred-stack-boundary=2 -o test test.c


-fno-stack-protector // 스텍 프로텍터 제거

-mpreferred-stack-boundary=2 // 더미 제거


컴파일을 하면 경고가 나올 텐데 무시하자.


실행을 해보면 입력한 그대로 반환하는 것을 볼 수 있다.



3. 디버깅 


먼저 intel 형식으로 변경한 뒤에 사용한 함수들을 확인하였다. 0x0804847d 에 main 함수가 들어가있고, 0x080484b7 secret 함수가 있다. 이 secret 함수 위치는 외워두도록 하자.


메인 함수에 브레이크 포인트를 걸고 메인 함수를 확인해 보았다. 눈에 띄는건 strcpy , printf 함수이다. 이 함수들은 위에 코드를 작성할 때 사용했던 함수이다. 



실행하는데 buf 에서 선언 했던 만큼 a 문자를 128번을 넣어서 실행을 해보자. 그리고 strcpy 함수 위치인 0x08048498 로 바로 넘어와 다음  코드를 실행하여 0x0804849d로 넘어와 레지스터를 확인해 보았다.


strcpy 첫번째 인자로 들어갔던 eax에 0xbffff028 부분에 우리가 입력하였던 a가 들어가 있을 것이다.



0xbffff028 부터 a의 아스키코드 값인 61이 들어가 있는 것을 확인할 수 있다. 그리고 코드를 최적화 했기에 buf에 128개가 가득 차고 바로 sfp 4바이트(0x00000000) 가 들어가고 그 다음부분이 ret 값이다. 이 ret 값에 secret 함수 시작 부분을 넣어주면 secret 함수를 실행할 수 있을것이다.


입력할 코드는 아래와 같다.


`python -c 'print "a"*128 + "1234" + "\xb7\x84\x04\x08"'`


해석해보면 a를 128 개를 넣는다.

sfp 4비트 값에 1234를 넣는다.

ret 값에 secret 함수 시작 부분인 0x080484b7 값을 리틀 엔디안 방식으로 넣는다.


※리틀 엔디안에 대한 글 보시려면 여기를 클릭하세요.



실행해보면 아래와 같이 실행된다.



'My Study > System' 카테고리의 다른 글

레지스터  (0) 2015.05.13
Handray  (0) 2015.03.25
리틀 엔디안(Little Endian), 빅 엔디안 (Big Endian)  (1) 2015.03.14
메모리 구조  (0) 2014.12.13
레이스 컨디션(Race Condition)  (1) 2014.11.18
,

최근 댓글

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.