[문제]


[풀이]

보호기법 분석

  • 64bits 바이너리
  • 카나리 존재
  • NX bits 존재
  • PIE 없음

 

소스코드 분석 - mistake.c

#include <stdio.h>
#include <fcntl.h>

#define PW_LEN 10
#define XORKEY 1

void xor(char* s, int len){
	int i;
	for(i=0; i<len; i++){
		s[i] ^= XORKEY;
	}
}

int main(int argc, char* argv[]){
	
	int fd;
	if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
		printf("can't open password %d\\n", fd);
		return 0;
	}

	printf("do not bruteforce...\\n");
	sleep(time(0)%20);

	char pw_buf[PW_LEN+1];
	int len;
	if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ 
		printf("read error\\n");
		close(fd);
		return 0;		
	}

	char pw_buf2[PW_LEN+1];
	printf("input password : ");
	scanf("%10s", pw_buf2);

	// xor your input
	xor(pw_buf2, 10);

	if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
		printf("Password OK\\n");
		system("/bin/cat flag\\n");
	}
	else{
		printf("Wrong Password\\n");
	}

	close(fd);
	return 0;
}
  • 문제 힌트를 기반으로 연산자들이 사용된 코드 위주로 분석해봄
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
  • 가장 먼저 password 파일을 읽어오는데, 작성자는 fd에 open에 대한 값을 할당한 후 비교 연산자가 수행되는 것을 의도했을 것임
  • open 함수
  • 연산자 우선순위
  • 연산자 우선순위에 따라 다음과 같이 진행됨
  • 사전에 정의되어 있는 password 파일을 read only로 읽어오는데 파일을 정상적으로 읽어오면 fd 값으로 양수가 반환됨
    • 양수 < 0 → false 이므로 0이 fd에 저장됨
    • 즉, fd는 0으로 표준 입력을 할 수 있음
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ 
  • 작성자는 len에 read에 대한 값을 할당한 후 비교 연산자가 수행되는 것을 의도했을 것임
  • read 함수
  • 앞선 코드에 따라 read 함수의 fd에는 0(표준 입력)이 들어가고 입력 값은 pw_buf에 PW_LEN(10)만큼 저장될 것임
    • read 함수가 정상적으로 작동되면 수신한 바이트 수를 반환하므로 비교 연산자와의 연산은 true가 됨
    • 본래는 fd에 1이 들어가면서 password 파일을 읽을 수만 있도록 하는 것이 의도였겠으나, fd가 0이 되면서 password에 대한 입력 값을 사용자가 설정해줄 수 있게됨
  • 이후에는 사용자에게 pw_buf2에 password 값을 입력 받아 1과 xor 연산을 수행한 후에 해당 값이 pw_buf와 같은지 비교하는 과정을 통해 일치하면 flag를 출력함

 

문제 해결

💡 pw_buf 값을 사용자가 줄 수 있음→ 사용자가 password를 위한 조건을 임의로 설정해줄 수 있음! 해당 값에 맞춰 1과 xor 연산 했을 때 나오는 값을 password로 입력해주면 될 것
  • 단, len은 10으로 맞춰줘야 함
    • 단순히 1111111111을 조건으로 설정해준다면 1과 xor 연산하여 나오는 0000000000을 입력해주면 됨
    • 1111111111 전체에 대한 xor 연산(1111111110)으로 생각하면 안됨
    • 반복문에서 1byte 단위로 xor 연산을 수행하기 때문에 각각에 대해 xor한 값을 넣어줘야 함
  •  


flag

🍒 Mommy, the operator priority always confuses me :(

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

[Pwnable.kr] blackjack  (2) 2022.10.15
[Pwnable.kr] shellshock  (0) 2022.10.15
[Pwnable.kr] leg  (2) 2022.10.15
[Pwnable.kr] input  (2) 2022.10.15
[Pwnable.kr] random  (0) 2022.10.14

+ Recent posts