[pwnable.kr]mistake

在这里插入图片描述
(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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值