1. Description
Exterminators stay away !
nc 157.230.33.195 3333
file Flag format : Trollcat{.*} Author : codacker
2. Write up
문제 파일을 받아서 확인해보면 64bit ELF 파일임을 확인할 수 있다.
# unzip dist.zip
Archive: dist.zip
inflating: crackme
# file ./crackme
./crackme: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=da0b706ba33eedf2a1c6122a3054203e69a4d343, for GNU/Linux 3.2.0, stripped
Bash
복사
문제 파일은 아래와 같이 실행된다.
•
실행 시 "Enter key: " 문자열 출력 후 입력받음
•
키가 틀린 경우 "Invalid key" 문자열 출력
# ./crackme
Enter key: aaaabbbbccccdddd
Invalid key
Bash
복사
실행으로 알아낸 정보를 기반으로 확인해보면 아래와 같은 루틴을 확인 할 수 있다.
•
[rbp+buf]에 입력한 문자열 저장
•
입력한 문자열을 기반으로 sub_563109F28738 함수 실행
•
함수의 결과가 0이 아닌 경우 플래그 출력
sub_563109F28738 함수의 결과에 따라 플래그가 출력이 되기 때문에 sub_563109F28738 함수 내부를 확인해봐야 한다.
함수 내부를 확인해보면 입력한 문자열과 특정 문자열(unk_563109F2B0D0)을 1byte씩 비교해서 전부 일치하면 플래그가 나오도록 되있다.
조건을 만족하기 위해서 특정 문자열(unk_563109F2B0D0)을 확인했으나 알아볼 수 없는 문자열이였다. 현재는 난독화된 문자열이지만 프로그램이 동작하면서 난독화된 문자열을 해제한 후 우리가 입력한 문자열과 비교하는 방식이 우선적으로 생각나서 동적으로 찾기를 시도했다. 따라서 sub_563109F28738 함수 내부에 브레이크포인트 설정 후 분석을 했다.
동적으로 분석을 하면 브레이크포인트를 설정했음해도 불구하고 프로그램이 그냥 끝나버린다. 그리고 원래는 잘못된 키를 입력하면 "Invalid key" 문구가 출력된다. 그렇지만 이번에는 "Wrong password"가 출력이 되었다.
"Wrong password"로 검색하면 아래와 같이 실제 있는 루틴이 있는 곳을 확인할 수 있다. 확인 결과 main함수에서와 유사한 형태의 루틴이 있음을 확인할 수 있었다. 해당 루틴이 있는 함수를 따라 올라가보면 init 함수에서 실행하는 것을 확인할 수 있었다.
실제 프로그램의 핵심 루틴을 분석하기 위해서 가짜 루틴인 sub_5568CED521E5 함수로 넘어갈 때 main함수로 RIP를 변조하여 정상적으로 실행되도록 했다.
정상적으로 main 함수 진입 후 unk_563109F2B0D0 위치에 저장한 값을 확인해봤더니 알아볼 수 없는 형태의 문자열이 풀려있음을 확인했다.
실제 문제 서버에 접속해서 위에서 찾은 "dumbhackerpassword"을 입력했더니 문제가 풀렸다.
3. FLAG
Trollcat{y0u_ptr4c3d_m3}