まず、ソースコードを見てみる

ヒントに演算子の優先順位だと書かれている。

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

このコードを見るとfdと0を比較するように見えるが、比較演算子(<)が=より優先順位が高いため、open関数の戻り値と0を比較した結果がfdに設定される。

なので、open関数でファイルが正常に開けたら0より大きい整数を返還するから、0と比較するとFalseなのでfdには0が入る。

 

次は

if(!(len=read(fd,pw_buf,PW_LEN) > 0))

このコードも上と同じ。

fdには0が入っているからstdinだ。つまり、ユーザーから入力される。

入力した値がpw_bufに入るからpw_bufは私のもの!

 

次は

scanf("%10s", pw_buf2);

pw_buf2の値を入力するので、pw_bufとpw_buf2両方私のもの!!

 

その後、xor(pw_buf2, 10);でpw_buf2を

#define XORKEY 1

void xor(char* s, int len){
        int i;
        for(i=0; i<len; i++){
                s[i] ^= XORKEY;
        }
}

こうやって1とxor演算をした値とpw_bufの値が同じであればOK!!

成功!!