문제풀이 환경
- 우분투
접속
- 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가 등장한다.
-ㄲㅡㅅ-