본문 바로가기

Pwnable.kr

Pwnable.kr [blukat]

#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);
	if(!strcmp(password, buf)){
		printf("congrats! here is your flag: ");
		calc_flag(password);
	}
	else{
		printf("wrong guess!\n");
		exit(0);
	}
	return 0;
}

맨 처음에 보고, fgets의 범위 지정이 100보다 크게 되었어서

오버플로우인가 하고 우선 gdb로 까봤다.

 

그러고 좀 요래조래 둘러보다가 

그냥 별 생각없이 password를 읽은 뒤로 bp를 걸고 실행했는데

 

..? 돌아간다. 

 

그러고 그냥 전역변수 안에 있는 password 내용을 읽어와서 밖에서 다시 전해주고 플래그를 얻었는데

아무리 생각해도 이상함...

 

password를 어떻게 읽었지? 원래는 못 읽잖아?

gdb 자체에서 하위 프로세스 열다가 permission 에러 뜨면서 그래야 되는데 안 그랬다.

 

???

 

검색해보니 그룹 권한에 blukat_pwn이 들어있었다..

 

진짜로 애초에 순서상 무조건 에러난다고 생각하고 실행 한 번도 안하고

그냥 정적 분석만 했으면 오래 걸렸을 문제라고 생각하니 

힌트가 이해가 된다. 

'Pwnable.kr' 카테고리의 다른 글

Pwnable.kr [fsb]  (0) 2019.05.21
Pwnable.kr [horcruxes]  (0) 2019.05.17
Pwnable.kr [unlink]  (0) 2019.05.14
Pwnable.kr [asm]  (0) 2019.05.08
Pwnable.kr [memcpy]  (0) 2019.05.08