先看看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 ", fd); return 0; } printf("do not bruteforce... "); sleep(time(0)%20); char pw_buf[PW_LEN+1]; int len; if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ printf("read error "); 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 "); system("/bin/cat flag "); } else{ printf("Wrong Password "); } close(fd); return 0; }
让pw_buf 和 ^1过的pw_buf2相等就可以cat flag了
题目给了提示,operator priority,运算符优先,即<会优先于=,所以会先打开password,里面的内容大于0,所以获得的flase 即fd=0
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
因为fd=0,是标准输入,所以我们可以进行输入
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ printf("read error "); close(fd); return 0;
那我们就可以输入pw_buf,之后在pw_buf2的位置输入一个10字节的数字并且异或1的值等于pw_buf,这样他们就相等,也就获得flag
这里我们让pw_buf等于0000000000,然后让pw_buf2等于1111111111 ,因为1111111111 ^1111111111=0
满足上面的if判断式
Mommy, the operator priority always confuses me :(