본문으로 바로가기

pwnable.kr ==> mistake 문제 풀기

category 시스템해킹/pwnable.kr 2020. 5. 29. 21:27
728x90

문제풀이 환경

- 우분투 

 

접속

- ssh mistake@pwnable.kr -p2222 (pw : guest)

 

힌트

- operator priority (연산자 우선순위)

실행 화면

 

무슨 파일이 있는지 먼저 확인해보도록 하자

 

문제풀이를 위해서 우선 mistake의 소스로 보이는 mistake.c 파일을 열어 보자

 

 

코드 설명

if(fd=open("/home/mistake/password", O_RDONLY, 0400) < 0)

open 함수의 원형

int open (const char *FILENAME, int FLAGS[, mode_t MODE])

const char *FILENAME : 읽을 파일 명

int FLAGS [ : 파일을 여는 옵션

mode_t MODE : O_CREAT옵션일 경우 필요한 접근권한 옵션, 여기서는 실제 password의 권한을 주었다.

 

if문에서 수식의 결과를 도출하려면 ' = '연산자를 지나야 하는데, ' = ' 연산자보다 ' < ' 연산자의 우선순위가 높기 때문에

open("/home/mistake/password", O_RDONLY, 0400) < 0

연산이 먼저 진행된다.

만약 정상적으로 파일이 열리게 되면 return 값은 양수를 반환하고, 아닐 경우 -1을 반환한다.

 

파일이 정상적으로 열리기 때문에 'open'함수는 양수

비교 값은 0인데 양수(true) < 0이기 때문에 fd의 값은 결국 0(false)이 된다.

 

if문이 정상적으로 끝나기 때문에 

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))

PW_LEN은 맨 위에 defin으로 10으로 지정되어있다. +1을 해주었으니 11 크기의 char형 배열 공간이 생긴다.

 

read함수의 원형

ssize_t read (int fd, void *buf, size_t nbytes)

int fd : 파일 디스크립터

void *buf : 파일을 읽어 들일 버퍼

size_t nbyte : 버퍼의 크기

 

아까 위에서 설명한 것처럼 ' = ' 연산자보다 ' > ' 연산자가 우선순위가 더 높다.

fd의 값은 0이 들어 가있고 read에서 0은 stdin을 의미한다. 사용자의 입력값은 buf에 들어간다.

 

xor("%10s", pw_buf2);
------------------------------
void xor(char * s, int len) {
	int i;
    for(i=0; i<lenl i++) {
    	s[i] ^= XORKEY;
    }
}

xor연산을 통해서 pw_buf2 xor 1 == pw_buf가 같으면 flag값을 보여준다.

 

 

10개의 비밀번호를 입력해서 xor연산 결과가 같을 경우 

flag값인 "Mommy, the operator priority always confuses me :("의 flag가 등장한다.

 

-ㄲㅡㅅ-

728x90