대단한 해킹 실력은 필요없다고 말하는 mistake 문제.
사실인지 확인해보자.
힌트는 operator priority 라고 한다.
소스 코드를 확인하자.
소스 코드를 하나씩 확인해보면,
우선 open() 함수로 password 파일을 연다.
그리고 open() 함수가 return 하는 file descriptor 값이
fd 변수에 들어가고 0과 대소 비교를 하는 줄 알았는데 .... !
힌트에서 알 수 있듯이 연산자 우선순위를 살펴보자 ..
이 부분에서 시간을 많이 썼다.
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
이 조건식 안에서 = 과 < 연산자의 우선순위는 < 연산자가 높다.
즉, open() 함수가 return 하는 fd 값과 0을 먼저 대소비교 한 후
그 결과를 fd 변수에 대입하는 것이다.
open() 함수는 password 파일을 열고 양수 값을 반환한다.
그리고 0과 비교하면 결과는 false 즉, 0이 된다.
최종적으로 fd 변수에는 0이 들어가게 되는 것이다.
이 말이 무슨 말이냐면,
sleep() 함수 호출 뒤에 read() 함수로 fd 변수에 해당하는 file descriptor 값을 가진 파일을 호출하는데
fd 값이 0 이기 때문에 stdin 즉, 사용자의 입력을 pw_buf 배열에 넣는다는 의미이다.
즉 우리가 pw_buf 배열에 값을 넣을 수 있고, 그 밑에서는 pw_buf2 배열에 값을 입력받고 있으니
쉽게 해결이 된다.
void xor(char* s, int len){
int i;
for(i=0; i<len; i++){
s[i] ^= XORKEY;
}
}
xor 함수에서 1 과 하나씩 xor 해주고 있기 때문에
pw_buf 의 값을 xor 한 결과를 pw_buf2 에 넣어주면 되겠다.
이제 pw_buf에 1 을 열 개 넣어주고
pw_buf2 에 0을 열 개 넣어주자.
clear!