(don’t take this too seriously, no fancy hacking skill is required at all)
还有个提示:运算符优先级
还是先看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\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;
}
问题其实出在main函数开头的这一句判断
if(fd=open(“/home/mistake/password”,O_RDONLY,0400) < 0)
用来赋值的等号优先级比小于号要高;
于是这个语句其实相当于
if(fd= ( open(“/home/mistake/password”,O_RDONLY,0400) < 0 ) )
这就导致两个问题,
一个是
open(“/home/mistake/password”,O_RDONLY,0400) < 0 ,
对于open函数,
当文件存在并且有权限读取的时候,返回的文件描述符必然不会小于0,
因此这个比较的结果肯定是false
另一个
fd=(表达式);
对于赋值语句,在赋值成功的情况下返回值是1;
这便导致最后
if(fd=open(“/home/mistake/password”,O_RDONLY,0400) < 0)
这个语句的判断必然成立,并且最后赋值得到 fd=0
又因为fd为0,1,2时分别指标准输入、输出,错误输出
所以其实后面的这一句
if(!(len=read(fd,pw_buf,PW_LEN) > 0))
事实上是从键盘读取输入的十个字符(这一句也存在优先级的问题)
再之后通过scanf读入十个字符到pw_buf2中,
然后用xor对pw_buf2中的每个字符都做与1异或的处理,
需要pw_buf2处理后的结果和pw_buf1相同
那么只需要第一次输入十个1,
第二次输入十个0