앞의 rev-basic 문제들과 비슷하나, 역연산을 요구하는 문제이다.
문제 파일을 다운로드 하면 exe파일이 있는 것을 확인할 수 있다.
압축 해제 후 x64dbg로 파일을 열어본다.
문자열 참조를 통해 correct를 찾아준다.
correct를 찾고, 해당 문자열을 사용하는 주소(00007FF7D3021177)로 이동한다.
Input값을 입력받고, chall3.7FF7D3021000에서 문자열을 검사하는 것을 알 수 있다.
해당 주소로 이동해보자.
해당부분이 문자열을 검사하는 부분인걸 알 수 있다.
이번에는, 앞의 문제들과 다르게 동적분석을 통하여 문제를 풀어볼 것이다.
동적분석을 위해서, 프로그램이 실행되다가 특정 부분에서 멈추게 하는 BP(Break Point)를 걸어줘야 한다.
문자열을 검사하는 부분을 확인하기 위해서, 문자열 검사 부분의 가장 위에 BP를 걸어주었다.
BP는 F2를 눌러서 설정할 수 있다.
BP를 설정한 뒤, 프로그램을 실행(F9)시켜본다.
그 뒤에 프로그램을 확인해보면
Input값을 받기 위해 대기하고 있다.
동적분석을 위해서 임의의 문자열 abcd를 입력해주었다.
다시 x64dbg로 돌아오면, 위에서 설정해준 BP에서 멈춰있는 것을 확인할 수 있다.
여기서 F8을 눌러서 한 줄씩 코드를 실행시킬 수 있다.
값들이 어디에 저장되는지 확인하기 위해서,
여기 있는 xor 명령어 전까지 실행시켜본다.
다음과 같이 xor까지 이동하고, 오른쪽의 FPU창을 확인해보겠다.
FPU창은 입력한 값이 어디에 저장되는지 알아보기 위하여 확인하는 것이다.
RAX에는 'I'라는 문자, RCX에는 입력한 첫번째 값,
RDX에는 입력한 전체 문자열이 들어가 있는 것을 확인할 수 있다.
여기서 'I'라는 문자는
이 부분에서 7FF7D3023000에 저장된 문자열을 가져온 것이다.
하지만 이곳에 저장된 문자열은 flag가 아니기에,
rcx에는 입력한 문자가 그대로 들어가게 되는게 아닌것을 추측할 수 있다.
다시 어셈블리어를 확인해보도록 하겠다.
이 부분을 확인하면, 뒤에 어떠한 연산을 진행하는 것을 확인할 수 있다.
이 분을 해석해보면,
1.RCX(입력한 문자)와 RSP(반복 수)를 xor연산한다. RSP는 0부터 시작한다.
2.RDX에 RSP(반복 수)를 저장한다.
3.RCX에 RCX(1의 결과값)+RDX(반복 수)*2를 저장한다.
다음과 같은 뜻이다.
그 뒤에 3의 결과값과 RAX(7FF7D3023000에 저장된 문자)를 비교하는 것이다.
이부분을 식으로 세워보면,
RAX = INPUT[i]^i+i*2
이다.
여기서 INPUT값을 알아내야 하기 때문에, 역연산을 해주겠다.
먼저 양변에 -i*2를 진행한다. =>
RAX-i*2 = INPUT[i]^i
그 뒤에, 양변에 ^i를 진행한다. =>
(RAX-i*2)^i = INPUT[i]
이 식을 통해서 flag를 구할 수 있다.
이 식을 c언어 코드를 통해 표현해보겠다.
이 코드를 실행시키면 flag를 구할 수 있다.
FLAG : I_am_X0_xo_Xor_eXcit1ng