-
[pwnable.kr] Level 9 - mistakeWargame/pwnable.kr 2023. 5. 7. 18:20반응형
Level 9 - mistake를 풀어보자.
문제를 보면 우리 모두는 실수를 하는데, 계속 나아가라고 적혀있다. (좋은 말인 것 같다.)
이번 문제에서는 특별히 해킹 기술이 필요하지는 않고, 기본 상식으로 풀어라고 되어있다.

<mistake의 문제 화면> 문제에서 알려준 곳으로 ssh 접속을 해보도록 하자.
flag, mistake, password 파일이 있다.
당연하게도 flag 파일을 바로 읽는 것은 막혀있다.

<mistake 서버 접속> mistake 파일을 실행해보니, 브루트포싱은 하지 마라고 한다.
그것을 방지하기 위해 프로그램을 실행할 때마다 약간의 지연이 있다.
그리고 test를 입력해보니 Wrong Password라는 문구가 출력되며 프로그램이 종료된다.

<mistake 프로그램 실행> mistake.c 파일로 프로그램의 코드를 살펴보자.
가장 위에는 xor 함수가 정의되어 있다.
간단하게, 입력값을 그 길이만큼 하나하나 XORKEY인 1과 xor 연산을 수행하는 함수이다.

<mistake의 xor 함수> 코드의 아래 부분을 보면 main 함수가 정의되어 있다.
sleep 함수때문에 지연이 발생하는 것 같다.
특별한 것은 없고, pw_buf2에 입력을 해주면 xor 함수를 수행해 pw_buf와 비교 후 맞으면 문제가 해결된다.

<mistake의 main 함수> 코드만 보면, 어떤 공격을 해야할 지 모르겠다.
그런데 첫 사진의 문제 화면을 보면 힌트가 있다.
연산자 우선순위가 이 문제를 해결할 힌트라고 한다.
이게 무슨 뜻인지 생각하며 코드를 다시 한 번 보면, fd에 값을 넣는 과정에서 비교 연산자가 있다.
그런데, 이 비교 연산자가 대입 연산자보다 우선순위가 높다.
즉 fd에는 open 함수의 결과를 0과 비교한 값이 들어가게 되는 것이다.
open은 파일을 열고 결과값을 받으므로 양수가 나오는데, 이것이 0보다 작다고 하니 False(0)이 fd에 저장된다.
그리고 len을 보면, read 함수가 먼저 수행이 되는데 fd에 0이 들어가므로 stdin을 의미하게 된다.
즉, pw_buf에 임의로 입력을 할 수 있다는 뜻이다.
이 정보들을 이용해 문제를 해결하면 된다.
프로그램을 실행해보면 sleep이 끝나고 엔터를 입력해야 input password가 나타나는 것이 힌트가 된다.
pw_buf2에 1과의 xor이 적용되므로 간단하게 1과 0으로 문제를 해결하면 된다.
먼저 1111111111을 pw_buf에 넣어주고, 0000000000을 pw_buf2에 넣어주면 flag가 출력된다.

<mistake의 flag 확인> 반응형'Wargame > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] Level 8 - leg (0) 2023.04.23 [pwnable.kr] Level 7 - input (0) 2023.04.09 [pwnable.kr] Level 6 - random (0) 2023.04.09 [pwnable.kr] Level 5 - passcode (0) 2023.04.01 [pwnable.kr] Level 4 - flag (0) 2023.02.05