티스토리 뷰

반응형

오늘 풀이할 문제는 mistake. 연산자 우선순위때문에 발생하는 취약점을 다룬 문제이다.

서버에 접속 하면 mistake, password, mistake.c, flag 파일이 있는 것을 확인 할 수 있다.

 

 

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


개발자의 의도는 password 파일에서 패스워드를 읽어와서 pw_buf에 넣고, 사용자에게서 받은 pw를 pw_buf2에 넣어서 pw_buf2를 1과 XOR한 결과가 pw_buf와 같다면 비밀번호가 맞으므로 flag 파일을 읽을 수 있도록 하는 것.

 

 

그러나 연산자 우선순위때문에 개발자가 의도하지 않은 행위가 발생하게 된다.

바로 if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0) 부분.

비교연산자 < 가 대입연산자 = 보다 우선순위가 높기 때문에 open()함수의 반환값과 0을 비교하게 된다.

이때 open()함수에서는 해당 파일이 존재하므로 양수 값을 반환하게 되고 해당 조건은 false(0)이 되므로 fd=0이 된다.

 

이때 포너블.kr 1번 fd 를 풀어봤다면 알듯 fd=0은 표준 입력 모드이기때문에 입력을 받게되고 이 값으로 pw_buf 값을 덮어 씌울수 있다.

모르는 사람은 아래의 링크를 참고하자!

https://pororiri.tistory.com/11?category=830248

 

pwnable.kr) fd write up

방학을 맞이해서 다양한 분야의 CTF 문제를 풀면서 공부하고 있다. 그 중 하나인 시스템 CTF 문제들을 모아둔 pwnable.kr 에서 1번 문제를 풀이 해보도록 하겠다. 제일 첫번째 문제 fd는 저기 귀여운 그림만큼 쉬..

pororiri.tistory.com

 

그러면 이제 원하는 아무 10자리의 문자로 덮어 씌운뒤 해당 문자와 1을 xor 한 결과만 확인하면 된다.

 

 

 

xor 1을 동작하는 프로그램을 위와 같이 작성하고 결과값을 확인한 뒤 해당 결과 값을 넣으면 된다!

 

성공!

 

이 문제를 풀면서 배운 점은 취약점은 아주 사소한 실수로 인해 발생하고 취약점을 찾기 위해서는 사소한 것도 꼼꼼하게 살펴보는 능력이 필요하다는 것이다.

꼼꼼하게 살펴보고 어디서 취약점이 발생할 수 있을지, 어떻게 방어 할 수 있을 지를 항상 고민해야겠다.

반응형
Comments
댓글쓰기 폼