//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;
}
<filename>
을 저장한다.<filename>
이 실행된다.root,dream으로 접속하고 싶지만 비밀번호를 모름
cat /etc/passwd
ruid -> 프로세스에서 실제로 사용하는 ID -> chall ID -> 1000
euid -> 프로세스가 실행되는 동안 현재 적용되는 권한을 나타내는 사용자 ID -> dream의 id -> 2123