security/포너블 - pwnable.kr

pwnable.kr - [Toddler's Bottle] bluekat

민사민서 2023. 2. 5. 04:58
#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 파일 바로 읽을 수 있음 ㅋㅋ