시스템 해킹

 1576, 1/79 회원가입  로그인  
   dudgb2380
   FSB질문이요

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


pwnable 문제를 풀고있는데


#include <stdio.h>
#include <alloca.h>
#include <fcntl.h>

unsigned long long key;
char buf[100];
char buf2[100];

int fsb(char** argv, char** envp){
        char* args[]={"/bin/sh", 0};
        int i;

        char*** pargv = &argv;
        char*** penvp = &envp;
        char** arg;
        char* c;
        for(arg=argv;*arg;arg++) for(c=*arg; *c;c++) *c='\0';
        for(arg=envp;*arg;arg++) for(c=*arg; *c;c++) *c='\0';
        *pargv=0;
        *penvp=0;

        for(i=0; i<4; i++){
                printf("Give me some format strings(%d)\n", i+1);
                read(0, buf, 100);
                printf(buf);
        }

        printf("Wait a sec...\n");
        sleep(3);

        printf("key : \n");
        read(0, buf2, 100);
        unsigned long long pw = strtoull(buf2, 0, 10);
        if(pw == key){
                printf("Congratz!\n");
                execve(args[0], args, 0);
                return 0;
        }

        printf("Incorrect key \n");
        return 0;
}

int main(int argc, char* argv[], char** envp){

        int fd = open("/dev/urandom", O_RDONLY);
        if( fd==-1 || read(fd, &key, 8) != 8 ){
                printf("Error, tell admin\n");
                return 0;
        }
        close(fd);

        alloca(0x12345 & key);

        fsb(argv, envp); // exploit this format string bug!
        return 0;
}

위의 printf(buf)부분을 공격하는거 같은데 인터넷을 돌아다니면서 배운것들은 전부 AAAA%x%x%x.....이런식으로 입력을 넣어서 몇번째 포맷인자가 맨앞의 스트링을 받는지 확인한 후에 거기에 주소값을 넣고 공격을 하는데 buf가 전역변수라 좀 다르게 나오더라구요.. 전역변수일 경우에는 어떤식으로 해야하나요

  Hit : 4667     Date : 2014/07/14 11:17



    
letmeln 질문에 대한 답변은 저도 몰라서 말씀 못 드리지만 위에 코드를 10줄 정도로 줄여서 디버거로 보면서 직접 테스트하시면 아마도 금방 이해하실 수 있어요ㅎㅎ 2014/07/25