您的位置:首页 > 其它

pwnable.kr [Toddler's Bottle] - mistake

2017-03-14 16:39 423 查看
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)

考查…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;
}


问题就出在
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
这里,由于fd=open()外没有括号,而 < 的优先级高于 = ,于是先执行 open() 函数,再比较和0的大小,最后赋值给fd。

当 open 成功时返回一个正数,这里的判断逻辑就变成了正数 < 0,返回false,也就是0。所以最后赋给 fd 的值为0,也就变成了stdin。

连续输入两个10byte的密码就行了,一个每一位和 1 亦或,比如可以输入00000000001111111111….(惭愧,笔者一开始还以为是栈溢出,没有看到少了括号,也没看到 “%10s” ,阴差阳错地输入了这条字串还给我跑出了flag。直到去琢磨了一下“operator priority”和“do not bruteforce”,仔细看了好久才发现 - - )

结果如下:

mistake@ubuntu:~$ ./mistake
do not bruteforce...
00000000001111111111
input password : Password OK
Mommy, the operator priority always confuses me :(
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c pwn