HackCTF의 가장 첫 번째 Reversing 문제입니다. 우선 이 문제의 경우 32bit ELF 파일이었기에 gdb를 이용하여 분석을 진행하였습니다. 간단하게 프로그램을 실행시켜보면 특정 인자를 필요로 하는 것으로 보였습니다.
persian@Code-PAPA:~/Downloads$ ./welcome_rev
Please provide a password!
인자로 전달할 문자열을 입력하자 Incorrect Password라는 문구가 출력되는 것을 보아 입력값을 비교하는 과정이 존재함을 추측할 수 있었습니다.
persian@Code-PAPA:~/Downloads$ ./welcome_rev test
Incorrect Password!
GDB를 사용하여 분석을 진행할 때 먼저 비교와 관련된 함수가 별도로 존재하는지 확인하였습니다.
0x0804851b check_password
0x08048737 main
main 함수와 별개로 check_password()
함수가 존재하는 것을 확인할 수 있었으며, main()
함수는 check_password()
함수의 결과값을 토대로 동작하는 것을 확인할 수 있었습니다.
check_password()
함수를 완전히 분석하기 이전에 'cmp', 'strcmp()
'와 같이 비교에 사용되는 부분을 위주로 살펴보았습니다. 만약 hard coding 되어있는 값과 비교할 경우 이 부분을 통해서도 정답을 얻을 수 있었기 때문입니다.
총 다섯 개의 cmp 명령과 한 번의 strncmp()
호출을 찾을 수 있었으며 그 중 strncmp()
함수에서 사용하는 인수 중 유의미한 값을 확인할 수 있었습니다.
SGFja0NURnt3M2xjMG0zXzcwX3IzdjNyNTFuNl93MHJsZEBfQCFfIX0=
해당 문자열의 끝이 '=' 문자로 끝나는 것을 보아 Base64 Type으로 유추하여 decoding을 진행하였고 flag를 획득할 수 있었습니다.