#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
char flag[100];
char password[100];
char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+";
void calc_flag(char* s){
int i;
for(i=0; i<strlen(s); i++){
flag[i] = s[i] ^ key[i];
}
printf("%s\n", flag);
}
int main(){
FILE* fp = fopen("/home/blukat/password", "r");
fgets(password, 100, fp);
char buf[100];
printf("guess the password!\n");
fgets(buf, 128, stdin); // bof 가능! 개행문자 나올때까지 128개 최대 입력 받음
if(!strcmp(password, buf)){
printf("congrats! here is your flag: ");
calc_flag(password);
}
else{
printf("wrong guess!\n");
exit(0);
}
return 0;
}
<gdb로 분석>
- Canary, Partial RELRO, No PIE, NX
- fp=[rbp-0x78], password=0x6010a0, buf=[rbp-0x70], canary=[rbp-0x8]
- 0x80 입력 가능하므로 sfp+RET 까지 덮을 수 있네
- gdb로 실행 도중 bp 걸어놓고 x/s 0x6010a0 해서 password 확인했는데 'cat: password: Permission denied' 저장되어있네??
- gdb 실행 시 setgid 적용 안되나 싶었는데 저게 실제 password 맞았음
- 입력해보니 calc_flag에서 계산되어 제대로 된 플래그 값이 나옴
<또다른 풀이>
- id 입력 시 현재 사용자의 user,group 등의 정보를 보여줌
uid=1104(blukat) gid=1104(blukat) groups=1104(blukat),1105(blukat_pwn)
- 즉 현재 유저는 두 개의 그룹에 속해있다
- -rw-r----- 1 root blukat_pwn 33 Jan 6 2017 password 파일 바로 읽을 수 있음 ㅋㅋ