[Toddler's Bottle]-mistake

  • 从ida反编译结果来看,有两次输入,只要第一次的输入字符每一位异或1后与第二次输入的字符相等就会cat flag ,有点没明白考点是撒
  • 事后看了师傅的wp才知道原来是源码出现了错误
#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;
}
  • 由于fd=open()外没有括号,而<的优先级高于= ,于是先执行open()函数,再和0比较大小,最后赋值给fd。

  • 当open成功时返回一个正数,这里的判断逻辑就变成了正数 < 0,返回false,也就是0。所以最后赋给 fd 的值为0,也就变成了stdin,所以就造成了ida反编译看有两次输入机会

  • 参考文章:

  • https://blog.csdn.net/qq_19550513/article/details/62045323

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • We all make mistakes, let's move on.(don't take this too ...
    Umiade阅读 230评论 0赞 1
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,885评论 0赞 5
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,791评论 0赞 5
  • 开篇第一题,不能太感伤,但内心总有些郁气无法抒解,只能以文字记之。如果我问人为什么而活,是个大而空乏的问题,千万种...
    蹙眉浅笑吟咏风歌阅读 255评论 0赞 0
  • 孩子的话像一把刀捅在我的心里,他责怪我出现在他的工作楼里。责怪了15分钟。我心里很难受。我需要他的尊重。 ...
    彩虹横空阅读 122评论 0赞 0

友情链接更多精彩内容