まず、ソースコードを見てみる
ヒントに演算子の優先順位だと書かれている。
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!!
成功!!


