pwnable.kr [Toddler's Bottle

2017-06-14  本文已影响36人  Umiade

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 :(

上一篇下一篇

猜你喜欢

热点阅读