SetUID는 유닉스 시스템을 해킹하는 데 매우 중요한 요소
유닉스 파일에 rwsr-xr-x로 권한이 설정되어 있는 경우
소유자 권한에서 x가 있을 자리에 s(rws의 마지막 문자)가 적혀있음
SetUID 파일은 누가 실행하든 상관없이 해당 파일이 실행될 때 파일 소유자의 권한을 갖는다는 것이 특징
해당 파일의 소유자가 root이면 그 파일을 실행하는 사람이 누구든 파일이 실행되는 동안 파일 소유자인 root 권한으로 실행됨
test라는 파일이 root 소유이고 SetUID 비트가 설정되어 있으면 아래와 같이 실행됨
SetUID 비트가 설정되어 있지 않으면 아래와 같이 실행됨
위와 같이 앞서 만든 shell 파일에 SetUID를 부여
shell 파일에 SetUID를 부여하고 나서, 일반 사용자 권한에서 shell 파일 실행
id 명령으로 자신이 uid 500의 wishfree라는 일반 계정임을 확인
SetUID 권한이 부여된 shell을 실행하면 euid(Effective Uid)가 0번, root로 바뀌고 프롬프트도 관리자 권한을 의미하는 #로 바뀜
위와 같은 간단한 형태의 해킹은 레드햇 6.2 이하 등의 초기 버전 운영체제에서만 가능
오래된 버전의 운영체제에서 예시를 드는 이유
int main(int argc, char *argv[])
char buffer[10]
strcpy(buffer, argv[1])
printf("%s\n", &buffer)
0x80483f8 [main]
0x804839f [main+1]
0x80483fb [main+3]
0x80483fe [main+6]
0x8048401 [main+9]
0x8048404 [main+12]
0x8048406 [main+14]
0x8048407 [main+15]
0x804840a [main+18]
strcpy 함수는 입력된 인수의 경계를 체크하지 않음
인수는 buffer[10]으로, 10바이트 길이를 넘지 않아야만 그보다 큰 인수를 받아도 스택에 쓰임
13개의 A를 인수로 사용한다면?
bugfile.c의 char buffer[10]이 할당되는 주소 공간이 12바이트, EBP가 저장되는 공간이 4바이트
일반적인 버퍼 오버플로우 공격에는 egg shell이라는 것을 사용
egg shell은 기계어로 만든 코드를 메모리에 로드해주고, 그 시작 주소가 어디인지 알려주는 일종의 툴
gcc -o egg eggshell.c
egg shell 실행
메모리의 0xbfffb58에 셸 적재됨
위의 과정을 거친 후, 일반 사용자 권한으로 돌아가서 펄(Perl)을 이용하여 A 문자열과 셸의 메모리 주소를 bugfile에 직접 실행
새로운 글 연재 ㄷㄷㄷㄷ