<문제>
<풀이>
먼저 문제에서 주어진 ip와 port번호를 이용해 live system에 접속해서 동작을 살펴보았다.
위와 같이 시스템에 접근하는 명령어를 입력한다.
(1) Enter username
(2) Confirm username
(3) Done
의 세가지 선택지가 뜬다.
(1)을 선택하여 username을 admin으로 입력해보았다.
그리고 (2)를 선택하여 Confirm username을 해보니 Current username이 admin이라고 떴다.
마지막으로 (3)을 선택해보니 admin으로 로그인한다고 뜨며
authentication code를 입력하라고 한다.
임의의 값 1234를 입력해보니 Access denied가 뜨며 프로그램이 종료된다.
IDA를 이용하여 문제에서 주어진 파일 re3.bin을 열었다.
main함수에서 디컴파일러를 실행했다.
main 함수는 세개의 함수를 호출한다.
generate_code()
configure_username()
login()이다.
이 세 함수를 차례로 살펴보았다.
generate_code() 함수는 랜덤으로 auth_code를 생성한다.
이때 auth_code는 아마 전역변수인 것 같다.
configure_username() 함수에서는 위에서 시스템에 접속했을 때 출력되었던 내용을 볼 수 있다.
username을 입력받을 때는 15자리의 문자열을 입력받고 그 내용을 auth_username에 복사한다.
이때 buffer overflow 취약점이 있는 strcpy()가 아닌 strncpy() 함수를 써서 공격을 방지한다.
while (1)을 이용해 무한루프를 돌며,
3을 입력하면 루프를 탈출한다.
login() 함수는 앞서 configure_username() 함수가 종료된 후 실행된다.
username이 admin이고
입력한 authentication code가 앞서 generate_code() 함수에서 생성한 auth_code와 일치하면 bash 쉘이 열린다.
bash 쉘이 열리면 문제에 나온 대로 /home/re3 경로로 이동하여 flag를 출력하면 된다.
문제는 bash쉘을 열려면 auth_code를 알아내야 하는데
auth_code는 랜덤으로 생성된다는 것이다.
게다가 live system에서 랜덤으로 생성되는 auth_code를 찾아야 하므로 어떻게 해야할지 더욱 감이 안 잡힌다.
auth_code를 비교하는 구문을 우회하는 방식으로 익스플로잇해야 하는 것일까?
문제에서 주어진 힌트인 해쉬값은 어떻게 활용해야하는 것일까?
잘... 모르겠다...
결국 플래그를 획득하지 못하고 문제 풀이를 마무리했다.
'CTF' 카테고리의 다른 글
[UTCTF 2024-misc] CCV (0) | 2024.03.31 |
---|---|
[VishwaCTF2024-misc] Who am I? (0) | 2024.03.02 |
[MapleCTF] JaVieScript (0) | 2023.09.30 |
[ASIS CTF] Grid(미해결) (0) | 2023.09.23 |
[Pointer Overflow CTF] Easy as it Gets (0) | 2023.09.20 |