시스템 해킹

 1576, 1/79 회원가입  로그인  
   asdf456
   대학교의 BOF강좌중 질문입니다

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


int main(int argc, char *argv[])
{
        char buffer[20] = {0, };                        // 0으로 초기화
        int *pointer_to_ret = (int *)(buffer+24);        // ret을 출력하기 위한 포인터 변수

        if(argc < 2)
        {
                printf("argument error\n");
                exit(-1);
        }

        // dumpcode로 메모리 덤프
        dumpcode(buffer, 28);          
        printf("[*] BEFORE : the return address is 0x%08x\n\n", *pointer_to_ret);

        // buffer overflow!!
        strcpy(buffer, argv[1]);
        
        // dumpcode로 메모리 덤프
        dumpcode(buffer, 28);          
        printf("[*] AFTER : the return address is 0x%08x\n\n", *pointer_to_ret);
}


여기서 리턴어드레스 수정인데요,
도저히 이해가안되는게....

리턴어드레스가 멀말하는건가요??
여기서 buffer이라는 변수은데 왜 리턴어드레스가필요한지요

  Hit : 3616     Date : 2011/12/27 05:07



    
phpmyadmin 리턴어드레스는 말그대로 해당 함수가 종료되면 리턴되는 주소를 말합니다.(RET)

이프로그램은 argv를 통해 사용자가 입력한 값을 buffer변수에 넣습니다.
따라서 buffer변수를 오버플로우시키면 *pointer_to_ret 변수를바꿀수있습니다.

이강좌에선 *pointer_to_ret이란 변수로 리턴어드레스를 대신했지만
실제로는 각 프로그램의 함수마다 리턴어드레스가 존재합니다.

이번 강의는 이런 리턴어드레스를 바꾸는 연습을 하는 강의네요
2011/12/27  
asdf456 음 그렇다면 main함수의 리턴어드레스인가요??
글고 리턴어드레스는 변수 맨뒤에 존재하는건지요??
2011/12/27  
phpmyadmin 1. 네(현재 강좌에선 실제 리턴어드레스대신 *pointer_to_ret를 통해 학습하는 방법입니다.)
2. 변수 맨뒤는 아니고 변수 너머에 있다고 봐야겠습니다. 여기선 버퍼배열에 정해준 공간인 20을 넘긴다음 부터 버퍼 오버플로우가 발생하는데요. 변수바로뒤가 아닌 buffer+24부분 부터 *pointer_to_ret가 있습니다.

즉 24개의 인자를 넘겨주면 *pointer_to_ret바로 앞까지 메모리가 덮어씌워지게되고
28개의 인자를 넘겨준경우 *pointer_to_ret에 해당(25~28부분)인자가 *pointer_to_ret에들어갑니다. 이때 메모리엔 리틀엔디안 방식으로 인자가 들어가니 관련 강좌 꼭 읽어보시기바랍니다.

만약 인자 20개의 공간까진 buffer변수고 25~28까지 4칸은 *pointer_to_ret이라 하였을때 실제 상황에서 21~24는 무엇인지 묻는다면 저는 SFP. (SFP(esp)는 대학교강좌에선 아직 언급이 많지않네요. 그럼 저도 패스. 있다는것만 알아두시.....지 마시고 간단하게 설명드리자면 스택의 최상위를 가리키는 포인터를 뜻합니다. 요것도 나중에 버퍼오버플로우를 통해 값을 바꾸셔서 리턴어드레스 변경에 기여할수있죠, 또한 특정 gcc 버전부터는 기본옵션으로 컴파일시 dummy(더미)라는 빈공간이 생깁니다. 스택에선 리턴어드레스와 지역변수사이 존재하죠. 더미가 있는경우 SFP는 리턴어드레스 바로 앞에 위치합니다.)
2011/12/27  
asdf456 phpmyadmin님 쪽지보냈어요 확인좀해주세요 2011/12/27  
phpmyadmin 수정.. SFP(ebp)네요 제가 잘못알고있어서..
esp는 스택의 위를 가리키는 포인터가 맞고 ebp는 베이스포인터라고도 불립니다.
베이스포인터는 함수가 호출되었을때 그 순간의 esp 를 저장하고 있다가, 함수가 리턴하기 직전에 다시 esp 에 값을 되돌려줍니다.
2011/12/31