문제를 접속하여 mistake의 소스코드를 보면 다음과 같다.
PW_LEN은 10으로, XORKEY는 1로 정의하고 있다.
xor 함수에서는 문자열과 길이를 인자로 받아 길이만큼 반복하며 문자열의 각 문자를 1씩 xor 연산을 한다.
main 함수의 첫번째 if문을 보면 할당연산자보다 비교연산자가 우선순위가 높아서 비교연산을 먼저 수행하면 open함수의 리턴값은 파일을 잘 읽어와서 fd 값을 반환하고, fd값은 음이 아닌 정수이기 때문에 비교 연산의 결과는 거짓이므로 fd에는 flase(0)값이 들어가고, 조건문은 수행하지 않는다.
PW_LEN+1 크기의 pw_buf를 선언하고, if 함수의 조건식에서 read함수를 실행한다. fd값이 위에서 0으로 저장되었기 때문에 fd 0 은 stdin 이라 PW_LEN만큼 pw_buf에 입력을 받는다. 입력을 받으면 크기는 0보다 커지기 때문에 not 연산으로 조건식은 거짓이 되어 조건문은 실행하지 않는다.
PW_LEN + 1 크기의 pw_buf2를 선언하고, 입력받는다. 이후 xor함수로 xor연산을 진행한다. 이후 조건문에서 xor한 pw_buf2와 pw_buf가 같다면 시스템 함수로 플래그를 출력할 수 있다.
xor 함수는 각 자리를 1로 xor 연산 하므로 1 xor 1 = 0 이 되므로 첫번째 입력값에는 0을 10개, 2번째 입력에서는 1을 10개 입력하면 플래그를 확인할 수 있다.
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C][자작문제] login (0) | 2021.04.12 |
---|---|
[Project H4C] C언어 코딩도장(15) (0) | 2021.04.11 |
[Project H4C][pwnable.kr] random (0) | 2021.04.08 |
[Project H4C][pwnable.kr] passcode (1) | 2021.04.06 |
[Project H4C] 포너블(시스템 해킹) 문제 서버 만들기(xinetd 활용) (0) | 2021.04.06 |