본문 바로가기

CTF

[UWSPPointerOverflowCTF] Sunshine on Filth is Not Polluted(미해결)

<문제>

 

<풀이>

먼저 문제에서 주어진 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