뭔가 실수를 했는갑다.
hint : operator priority
뭘 어쩌란건지 한참 보다가 힌트에서 힌트를 얻고( 역시 문제를 잘 봐야되 ) 연산자 위주로 살펴보았다.
if( fd=open("/home/mistake/password",O_RDONLY,0400) < 0 )
보통은
if( ( fd=open("/home/mistake/password",O_RDONLY,0400) ) < 0 )
이렇게 한다는걸 몇번이나 지나치다 if((len=read())>0) 이걸 보고 알았다.
연산 순서를 찾아보니 대입연산자가 비교연산자보다 순위가 뒤인걸 알아냈다.
즉 '>'연산을 '='연산보다 먼저 수행하는 것이다.
open()함수는 파일을 성공적으로 열면 file descriptor 번호를 반환한다.
이때 0,1,2는 각각 stdin, stdout, stderr에 할당되어있으니 항상 3이상의 값을 반환한다.
즉 open("/home/mistake/password",O_RDONLY,0400) < 0 이 연산은 false의 의미로 0을 반환하고 fd엔 0이 입력 된다.
이 때 file desciptor는 stdin이므로 pw_buf와 pw_buf2 모두 stdin으로 값을 입력받는다.
pw_buf2에 사용한 xor함수이다. 똑같은 test code를 만들어 임의의 10byte를 넣어보자.
pw_buf엔 0325403254를, pw_buf2엔 1234512345를 입력하면 flag를 확인할 수 있다.
1점짜리 문제였지만 나도 자주하는 실수로 이렇게 flag가 털리는 걸 보니 뭔가 묘했다.