1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #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; } |
문제의 힌트는 연산자 우선순위
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
open()함수에서 파일 열람이 정상적으로 수행되면 양수를 반환, 실패 시 -1을 반환한다.
정상적으로 파일을 열기가 실행 되어 양의 정수가 나오고 양의 정수가 0보다 작은 것은 False이므로 fd에는 0이 들어감
if(!(len=read(fd,pw_buf,PW_LEN) > 0))
read()의 fd는 0으로 인식되므로 STDIN으로 입력받게 됨
C 연산자의 우선 순위 및 결합성
Symbol1 | 연산 형식 | 결합성 |
---|---|---|
[ ] ( ) . –>후위 ++ 및 후위 –– | 식 | 왼쪽에서 오른쪽 |
전위 ++ 및 전위 –– sizeof & * + – ~ ! | 단항 | 오른쪽에서 왼쪽 |
형식 캐스팅 | 단항 | 오른쪽에서 왼쪽 |
* / % | 곱하기 | 왼쪽에서 오른쪽 |
+ – | 더하기 | 왼쪽에서 오른쪽 |
<< >> | 비트 시프트 | 왼쪽에서 오른쪽 |
< > <= >= | 관계 | 왼쪽에서 오른쪽 |
== != | 같음 | 왼쪽에서 오른쪽 |
& | 비트 AND | 왼쪽에서 오른쪽 |
^ | 비트 제외 OR | 왼쪽에서 오른쪽 |
| | 비트 포함 OR | 왼쪽에서 오른쪽 |
&& | 논리 AND | 왼쪽에서 오른쪽 |
|| | 논리 OR | 왼쪽에서 오른쪽 |
? : | 조건식 | 오른쪽에서 왼쪽 |
= *= /= %= += –= <<= >>=&= ^= |= | 단순 및 복합 할당2 | 오른쪽에서 왼쪽 |
, | 순차적 계산 | 왼쪽에서 오른쪽 |
mistake@ubuntu:~$ ./mistake
do not bruteforce...
0000000000
input password : 1111111111
Password OK
Mommy, the operator priority always confuses me :(
'WarGame > pwnable.kr' 카테고리의 다른 글
Shellshock (0) | 2016.12.11 |
---|---|
input (0) | 2016.12.03 |
random (0) | 2016.11.27 |
passcode (0) | 2016.11.27 |
flag (0) | 2016.11.27 |