레벨 해킹

 2839, 1/142 회원가입  로그인  
   Spero
   LOB Goblin(level4)문제 질문

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3303 [복사]


/*
        The Lord of the BOF : The Fellowship of the BOF
        - orc
        - egghunter
*/

#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);
        }

        // 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);
        }

        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
}

LOB level4 문제인데요.. 그냥 별거 없어서 복사해서 다른이름으로 마지막 프린트문으로 %x 써서 버퍼 주소를 알아낸다음에 공략해봤는데요.. 복사한 파일은 쉘이 따지는데 이 본문제의 쉘은 안따지네요.. 무엇이 문제일까요??

  Hit : 2728     Date : 2013/07/28 01:35



    
kumi123 그러니깐.. 뭐라고 해야 할까요..

복사본에 주소와 원본의 주소가 100% 일치 하지 않습니다..

앞뒤로 nop을 엄청나게 둔다음에, 따시면 금방 따질 것입니다..
2013/07/28  
Spero ret 주소 마지막에 bf가 들어가야되서 앞뒤로 nop엄청나게 한다고 풀어질거같지가않은데.... 좀 자세히좀 말해주세요 ㅋㅋㅋ 2013/07/28  
kumi123 argv[2] 에 넣어서 푸심 되요..^^

꼭 buffer에 올릴필요는 없다는..
2013/07/28  
Spero 음 저도 구글링해서 다른분들꺼 풀이보면서 argv[2]에 올리면 풀리는건알겠는데... 그러니까 왜 풀리는지? 이런것도 의문이가서... 이방법으로 풀어볼려고하다보니까 ㅎㅎ.. ;; 2013/07/28  
kumi123 쉘코드를 아무대나 넣어도, ret이 쉘코드만 가르키만다면, 쉘코드가 실행이 됩니다..

그런이유로, buffer에 넣어도, ret뒤에 넣어도, argv[0]에 넣어도, argv[2], 환경변수에 올려도

되는 것이지요...
2013/07/29  
Spero 오호... 제가 너무 틀에 박힌 생각만 한거같네요.. ㅋㅋ 근데 원인을찾았습니다. 사본과 원본의 이름의 길이가 다를경우 다른 주소를 주던데 그 이유도 혹시 아시나요?? ㅎㅎ 2013/07/29  
kumi123 아규먼트의 크기(길이) 에 따라, 스택에 아랫부분에 아규먼트가 쌓이기 때문에..

주소가 밀릴수가 있습니다..

그 이유로, argv[2]에 10000만쯤 넣으면...

0xbfff 가 아니라..

0xbffe 이런식으로도 나올 거에요..
2013/07/30