[Reversing] rev-basic-6 문제풀이 |
문제를 확인해보자.
Correct를 출력하는 FLAG 값을 찾는 문제이다.
문제 파일을 x64dbg 프로그램으로 열어보자.
correct를 출력하는 flag 값을 찾아야하기 때문에 문자열 참조 찾기를 통해 correct 문자열을 찾아보자.
사용자가 FLAG를 입력하고 chall6.7FF613711000 함수에서 입력 값 비교를 한 뒤,
Correct/Wrong 메시지를 출력한다. 해당 함수를 따라가보자.
위 함수에서 사용자 입력 값에 대해 수행하는 연산은 다음과 같다.
[cmp rax, 12] // 18번 반복
[movzx eax, byte ptr ds:[rcx+rax] // n번째 문자열 eax에 저장
[lea rcx, qword ptr ds:[7FF613713020] // rcx에 [7FF613713020] 주소 저장
[movzx eax, byte ptr ds:[rcx+rax} // eax에 (rcx+rax) 주소에 해당하는 값 저장
[lea rdx, qword ptr ds:[7FF613713000] // rdx에 [7FF613713000] 주소 저장
[movzx ecx, byte ptr ds:[rdx+rcx] // ecx에 (rdx+rcx) 주소에 해당하는 값 저장
[cmp eax, ecx] // eax와 ecx 값 비교
위 함수는 [7FF613713000] 주소에 저장된 18개의 값과
[7FF613713020] 주소에 사용자가 입력한 문자의 값을 더한 주소에 존재하는 값을
비교하는 함수이다.
[7FF613713020] 주소 - 사용자 입력 값을 더한 주소에 위치한 값을 출력하기 위한 base 주소
[7FF613713000] 주소 - 함수에서 사용자 입력 값을 연산하고 최종적으로 비교하는 문자가 저장된 주소
FLAG를 찾기 위해서는 비교하는 문자를 [7FF613713020] 주소 이후의 값에서 찾아내고,
해당 주소에서 base 주소를 뺀 나머지 값을 추적하면 된다.
코드는 다음과 같다.
코드를 실행해보자.
출력된 문자열을 프로그램을 실행시켜 입력해보자.
문제풀이 끗