pwnable.kr [Toddler's Bottle] - mistake

本文分析了一个基于真实事件的任务,该任务涉及C语言中的一个常见编程错误:操作符优先级问题导致的逻辑漏洞。通过详细解释代码中的问题所在,并提供解决方法,帮助读者理解如何避免此类错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 :(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值