看一下题目
ssh连接一下
看一下目录的文件
先看一下 mistake.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;
}
大概分析一下这个程序的逻辑是
1.题目从/home/mistake/password文件中读取10字节数据
2.我们输入10字节并把这10个字节与XORKEY (0x1)异或
3.对比上面两个字符串是否一致,一致则输出flag
看起来最简单的方法是 cat一下password的文件,但是我们是没有权限读取的
还有一个方法是可以爆破,但仔细看它的题目提示是不需要花里胡哨的黑客技能的,所以应该也不是爆破
这句提示也说明了是符号优先级的问题
找了一下资料后发现问题出在这行代码里
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
{
...
}
因为比较运算符优先级高于赋值运算符,而open打开一个文件,任何情况下返回都不会小于0,所以比较之后的结果等于0,0就赋值给了fd(fd=0),如果fd=0,那么之后的read(fd,pw_buf,PW_LEN)
实际上是从stdin读取,stdin我们可以控制是我们可以控制输入的,控制了两个buf解开就很简单了
第一次输入1111111111(1是0x31),第二次输入0000000000(0x30),第二次经异或0x1也变为了111111111