촉촉한초코칩
[Dreamhack] file-special-bit 본문
코드
//Name: chall.c
//Compile: gcc chall.c -o chall -no-pie -fno-stack-protector
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]){
if(argc == 2){
char filename[10];
char cmd[20];
int ruid = 0;
int euid = 0;
memcpy(filename, argv[1], sizeof(filename));
snprintf(cmd, 19, "cat %s", filename);
printf("Your ruid : \n");
scanf("%d", &ruid);
printf("Your euid : \n");
scanf("%d", &euid);
if(ruid == getuid() && euid == geteuid()) {
setreuid(geteuid(), geteuid());
printf("Your ruid : %d Your euid : %d\n", getuid(), geteuid());
system(cmd);
} else {
printf("No.\n");
}
}
else {
printf("argument...\n");
}
return 0;
}
코드
- 명령어 인자가 2개인지 확인한다.
- 명령어 인자로 받은 파일 이름을 filename 배열에 복사한다. (최대 10바이트)
- 파일을 출력할 명령어 cmd에 cat <filename> 형식으로 파일 이름을 연결해서 만든다. (최대 19바이트)
- 사용자가 직접 자신의 실 사용자ID(ruid)와 유효 사용자 ID(euid)를 입력한다. getuid(), geteuid() 함수를 사용해 현재 프로세스의 실 사용자 ID와 유효 사용자 ID를 가져오고 일치할 경우 cat <filename>이 실행된다. 그리고 파일을 출력한다.
공격
ssh로 들어가기
유저 목록 보기
dream으로 들어가려 했으나 현재 id가 chall이기 때문에 들어갈 수 없음
비밀번호를 알아봄
cat /etc/passwd
x가 패스워드를 나타내는데, /etc/shadow 파일에 암호화되어 저장된다.
계속 shadow 파일 읽기 권한을 얻는 걸 실패해서 코드의 취약점을 이용해서 dream으로 접속하려고 함
ruid : /etc/passwd에서 3번째 자리
1) euid : 프로세스가 권한을 행사할 때 사용하는 ID -> 그렇다면 chall의 아이디..?
2) 이번에는 euid에 root 아이디를 넣어봄
음..
모르겠어서 1번에서 쓴 걸 바꿔서 써봤는데 flag가 나왔다.
그러면 ruid가 1000, euid가 2123이라는건데,
ruid는 프로세스를 시작한 사용자의 실제 ID이므로 -> 내가(chall) 됨
euid는 프로세스가 실행되는 동안 현재 적용되는 권한을 나타내는 사용자 ID -> dream의 권한으로 flag를 실행해야 하므로 dream이 됨
어쩌다가 문제를 다 풀고 나서야 이해가 되었다..ㅋㅋ
'Study > MISC' 카테고리의 다른 글
[Dreamhack] 산타 할아버지도 힘들어요 (0) | 2024.10.29 |
---|---|
[Dreamhack] whatsdifferent (1) | 2024.10.02 |
[Dreamhack] Robot Only (1) | 2024.09.17 |
[Dreamhack] Snowing! (0) | 2024.09.17 |
[Dreamhack] addition-quiz (0) | 2024.09.11 |