cgy12306
[pwnable.kr] mistake 본문
힌트를 보면 hint : operator priority
라고 적혀있다.
연산자 우선순위에 대한 문제인것 같다.
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;
}
연산자 우선순위에 의하면 부등호 연산자가 대입연산자보다 우선순위가 높다.
그래서 위의 코드는 부등호에 대한 연산을 먼저 수행하고 값을 대입을 하게 된다.
open 함수는 0과 -1을 반환하는데 성공을 하면 0을 반환하고, 실패하면 -1을 반환한다.
그래서 password 파일을 open에 성공하면 파일 디스크립터인 fd값이 0으로 설정이 되고, read 함수에서 pw_buf에 값을 넣게 된다.
다음 pw_buf2에 10byte 값을 넣고 각 글자를 1과 xor 연산을 해서 결과 값을 pw_buf와 비교를 한다.
그리고 같으면 /bin/cat flag 명령어를 실행한다.
xor 연산 특성 중에 a ^ 0 = a 라는 특성이 있다.
맨 처음 read 함수에서 1111111111을 입력하고, 두번째 입력 때 0000000000을 입력해서 xor 연산 결과를 1111111111로 만들 수 있다.
그러면 pw_buf와 pw_buf2가 같으니 flag를 출력할 것이다.
'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] passcode (0) | 2020.01.26 |
---|---|
[pwnable.kr] shellshock (0) | 2020.01.26 |
[pwnable.kr] leg (0) | 2020.01.26 |
[pwnable.kr] flag (0) | 2020.01.26 |
[pwnable.kr] bof (0) | 2020.01.26 |