【Writeup】Pwnable.kr 0x09 mistake

0x09 mistake

题目描述

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 [email protected] -p2222 (pw:guest)

题目代码

#include 
#include 

#define PW_LEN 10
#define XORKEY 1

void xor(char* s, int len){
    int i;
    for(i=0; i 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;
}

题目分析

首先,我们分析一下这段代码,代码的本意是读取password里的密码,然后该密码与1进行按位异或,得到结果和我们输入的password进行比较,如果前10位相等,那么就输出flag。这道题,很有意思,因为我们不知道password文件里的内容是什么,因此就要向如何绕过那里。看一下题目描述,给了hint,是 operator priority,运算符优先级,重新阅读代码,看到这里

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
        printf("can't open password %d\n", fd);
        return 0;
    }

if判断里,fd=open("/home/mistake/password",O_RDONLY,0400) < 0,“<”的优先级要大于"=",因此,会优先执行

open("/home/mistake/password",O_RDONLY,0400) < 0

这里是的意思是用只读的方式打开password文件,在这里肯定能够打开的,所以0<0为否,返回0,即fd=0(0是stdin的文件描述符),那么这道题就可以转传成我们输入一个password然后与1异或,接着再输入password,使得与刚才的那个结果相同就好了。


【Writeup】Pwnable.kr 0x09 mistake_第1张图片

你可能感兴趣的:(【Writeup】Pwnable.kr 0x09 mistake)