mistake

Operator precedence: the result of the comparison lands in fd instead of the file descriptor from open().

2026.08.18 Pwn original post

Figure 1

패스워드를 알아내야지 플래그를 볼수있는듯함.당연히 소스 코드먼저 봐주겠음.

Figure 2

에바로다가김. 대충 훑어보면 패스워드 비교 코드임을 알수있음. 취약점은 무엇일까… if 문을 잘 살펴보자 보자 보자꾸 나. open 조건문이다! if(fd=open(“/home/mistake/password”,O_RDONLY,0400) < 0){ 의도한 코드: cif((fd = open(…)) < 0) // fd에 저장 후 음수인지 확인 실제 동작: cif(fd = (open(…) < 0)) // 비교 먼저! 결과(0 또는 1)가 fd에 저장됨 < 연산자가 = 보다 우선순위가 높아서, 비교 결과(0 또는 1)가 fd에 들어가요.

두개이기 때문에 read() 조건문도 잘펴봐주겠다 (집중해 ㄱㅇㅇ) if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ 같은 이유로: cif(!(len = (read(fd, pw_buf, PW_LEN) > 0))) // len에는 실 제 읽은 바이트 수가 아닌 0 또는 1이 저장됨 결과적으로 fd는 open() 반환값이 아닌 0 또는 1 fd = 0이면 표준입력 (stdin) 을 읽게 됨! fd = 0 → read(0, pw_buf, PW_LEN) → 키보드 입력을 읽음 pw_buf와 pw_buf2가 둘 다 내 입력이니까, 내가 원하는 값을 넣을 수 있다.

strncmp(pw_buf, pw_buf2, 10) == 0

이 조건을 통과하려면 pw_buf == XOR1(pw_buf2) 이어야한다. 즉 pw_buf에 들어갈 값을 먼저 입력 그 값을 XOR 1 한 결과를 pw_buf2로 입력 strncmp 통과!

예를 들어 0000000000 을 입력하면, XOR 1 결과는 1111111111 이니까:

  • 첫 번째 입력: 0000000000
  • 두 번째 입력: 1111111111

하면 Password OK 가 뜸

Figure 3