반응형

login as : gremlin

password : hello bof world


문제 파악

 

 

gremlin 계정으로 로그인하여 gremlin 디렉터리 안에 있는 파일들의 목록을 보면 cobolt와 cobolt.c가 있다.

 

cobolt는 cobolt의 계정의 setuid 권한이 걸려있기 때문에 cobolt 프로그램을 실행할 때는 cobolt 계정의 권한으로 실행된다.

 

/*
        The Lord of the BOF : The Fellowship of the BOF
        - cobolt
        - small buffer
*/

int main(int argc, char *argv[])
{
    char buffer[16];
    if(argc < 2){
        printf("argv error\n");
        exit(0);
    }
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);
}

 

cobolt.c 파일의 내용을 보면 16byte짜리 buffer를 선언하고, 사용자로부터 커맨드라인 인자가 무조건 있어야 하며, 사용자로부터 받은 입력값을 buffer에 담았다가 출력한다.

 

여기서 strcpy() 함수로 사용자의 입력값을 검증하지 않고 buffer에 넣기 때문에 bof 취약점이 발생한다.


공격

 

이번 문제는 셸 코드를 넣기에는 buffer의 크기가 작으므로 환경 변수를 이용하면 되지만, RTL 기법을 이용한다.

 

ldd 커맨드라인 도구로 먼저 aslr 기법이 걸려있는지 확인한다.

 

두 번 실행했을 때 값이 같은 것으로 보아 aslr 기법은 걸려있지 않다.

 

 

nm 커맨드라인 도구는 오브젝트 파일, 실행 파일 또는 오브젝트 파일 라이브러리 중 하나인, 지정된 File에 있는 심볼에 대한 정보들을 리스트 형식으로 보여준다.

 

nm 명령을 이용해 system 함수의 주소를 알아온다.

 

 

strings 커맨드라인 도구를 이용해 "/bin/sh" 문자열의 위치를 구한다.

 

위의 system의 주소와 "/bin/sh"의 주소 모두 offset 값이므로 base 주소인 40018000 주소에 더하면 각각 0x40058AE0 주소와 0x400FBFF9 주소이다.

 

 

cobolt의 스택 dummy 값을 확인하기 위해 gdb로 확인해 보면 buffer 변수의 크기가 16이였는데 스택 공간도 16byte만 확보하는 것을 보니 dummy 값은 없다.

 

./cobolt `python -c 'print "a" * 16 + "bbbb" + "\xe0\x8a\x05\x40" + "cccc" +"\xf9\xbf\x0f\x40"'`

 

위와 같이 공격 스크립트를 만들어 공격하면 성공적으로 cobolt의 password hacking exposed를 얻을 수 있다.

 

참고)

system() 함수를 호출하는 것이 아닌 RET 부분에 sysem() 함수의 주소를 덮어씌워서 반환시키는 것이므로 스택의 구조는 "system() 함수 주소 + system() 함수의 RET 부분 + 인자" 형태로 SFP 부분은 없어도 된다.

 

그리고 system() 함수를 호출해 셸을 얻고 나서는 공격이 끝나므로 system() 함수의 RET 부분에는 4byte 아무런 값이나 들어가도 된다.

 

 

반응형

+ Recent posts