0x09 mistake
题目描述
We all make mistakes, let's move on.
(don't take this too seriously, no fancy hacking skill is required at all)
This task is based on real event
Thanks to dhmonkey
hint : operator priority
ssh mistake@pwnable.kr -p2222 (pw:guest)
题目代码
#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;
}
题目分析
首先,我们分析一下这段代码,代码的本意是读取password里的密码,然后该密码与1进行按位异或,得到结果和我们输入的password进行比较,如果前10位相等,那么就输出flag。这道题,很有意思,因为我们不知道password文件里的内容是什么,因此就要向如何绕过那里。看一下题目描述,给了hint,是 operator priority,运算符优先级,重新阅读代码,看到这里
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
if判断里,fd=open("/home/mistake/password",O_RDONLY,0400) < 0,“<”的优先级要大于"=",因此,会优先执行
open("/home/mistake/password",O_RDONLY,0400) < 0
这里是的意思是用只读的方式打开password文件,在这里肯定能够打开的,所以0<0为否,返回0,即fd=0(0是stdin的文件描述符),那么这道题就可以转传成我们输入一个password然后与1异或,接着再输入password,使得与刚才的那个结果相同就好了。