tmxklab

[pwnable.kr] mistake 본문

War Game/pwnable.kr

[pwnable.kr] mistake

tmxk4221 2020. 11. 20. 17:37

1. 문제 확인

 

mistake@pwnable:~$ ls -l
total 24
-r-------- 1 mistake_pwn root      51 Jul 29  2014 flag
-r-sr-x--- 1 mistake_pwn mistake 8934 Aug  1  2014 mistake
-rw-r--r-- 1 root        root     792 Aug  1  2014 mistake.c
-r-------- 1 mistake_pwn root      10 Jul 29  2014 password

 

[ 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;
}

pwn_buf에는 "/home/mistake/password" 파일의 10byte가 저장되어 있고 pwn_buf2에는 10byte만큼 사용자 입력을 받고 xor()에서 xor을 진행한 결과 값이 저장되어 있다.

 

최종적으로 pwn_buf와 pwn_buf2의 10byte를 비교했을 때 같아야 플래그 값을 확인할 수 있다. password는 권한이 없어서 내용을 확인할 수 없다.

 


2. 접근 방법

 

서버 느려서 걍 로컬에서 mistake.c 컴파일해서 확인

근데 한 번만 입력받아야 되는데(pwn_buf2) 2번 입력을 받을 수 있다(?)

 

확인해보니 파일을 성공적으로 열면 eax에 3으로 세팅되는데 open호출 다음 어셈블리어 shr eax, 0x1f를 실행하고 eax에 0으로 세팅된다. eax는 fd값으로 다음 read함수에서 사용된다.

 

if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
	printf("read error\n");
	close(fd);
	return 0;		
}

 

위 if문에서 연산자 우선순위에 의해 read의 리턴 값()을 len에 먼저 저장하는 것이 아니라 "> 0"

즉 shift연산을 진행하기 때문

 

따라서, 입력을 2번 받을 수 있고 사용자가 알아서 pwn_buf랑 pwn_buf2의 10byte 입력 값을 동일하게 맞추면 된다.

xor()에서 pwn_buf2는 10byte만큼의 원소들을 모두 1씩 xor연산하니깐 pwn_buf보다 1만큼 작으면 됨

 


3. 문제 풀이

 

pwn_buf 입력 : cccccccccc(0x63636363...)

pwn_buf2 입력 : bbbbbbbbbb(0x6262626...)


4. 몰랐던 개념

'War Game > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] coin1  (0) 2020.12.02
[pwnable.kr] shellshock  (0) 2020.11.20
[pwnable.kr] leg  (0) 2020.11.20
[pwnable.kr] input  (0) 2020.11.20
[pwnable.kr] random  (0) 2020.11.20
Comments