[리버싱]드림핵 rev-basic-3 풀이
문자열 찾기로 또 main부분을 찾아줬다.
뭔가 또 비교하고 Correct나 Wrong이 출력되는 모습이다.
비교해서 correct,wrong이 나오기 전에 부분이 중요해 보여서 자세히 들어가 보았다.
test eax eax 부분에서 0이면 wrong이 나온다.
이번 문제는 도저히 모르겠었다...... 참고한 것들을 통해 문제를 풀어보았다.
lea rcx,qword ptr ds:[7FF78C4A3000]을 통해 rcx에 dump 주소값을 넣는것을 볼 수 있다.
movzx eax, byte ptr ds:[rcx+rax]를 통해 rax에 dump rcx+rax주소에 해당되는 값을 넣고 rax가 0이므로 rcx인 00007FF7458D3000값인 I가 들어간다.
movsxd rax,dword ptr ss:[rsp]부분을 통해 stack에서 000000A3932FF7B0주소 값을 찾아 rcx에 넣었고 이때 아무 값이 없어 0이 들어간다.
참고한 블로그에서 input값을 hihihi로 주었다.
그래서 hihihi는 rsp+20에 저장되어 있는 것을 확인 할 수 있다.
ecx에 덤프의 rdx+rcx주소에 있는 값의 제일 앞에 1바이트를 가져오는데 여기서는 h다.
rcx값과 스택에서 rsp주소에 해당하는 값 xor을 수행한다.
edx에 슽택에서 rspㅈ소에 해당하는 겂을 넣는것을 볼 수 있고 ecx에 dump에서 rcx+rdx*2한 주소에 있는 값을 넣는다.
참고한것에서 비교대상이 되는 값 I와 입력한 h를 비교하고 같지 않으면 return을 한다.
따라서 ds:[7FF78C4A3000]에 있는 값이 비교할 값인것을 확인 할 수 있었다.
xor로 1씩 늘어나고 *2로 2배가 되는 것을 주의해야 된다고 한다.
결론은 출력값 = (입력값 * ss:[rsp]) + rdx*2를 수행하는 것을 확인 할 수 있고 출력값을 알아서 입력값을 역으로 구하면 된다
입력값 = {출력값 - (rdx*2)}xor ss:[rsp]를 하면 구할 수 있다.
I는 ss:[rsp]값이 1이고 rdx*2의 값은 0이기 때문에 그대로 입력해도 된다고 한다.
rdx*2값은 2, ss:[rsp]의 값은 1이다. (96-2)xor1=95가 된다 그래서 '(96)에서 '일때 96에 해당되는 문자열인_을 입력하면 된다고 한다....
g(103)의 경우 rdx*2값이 4, ss:[rsp]의 값은 2이므로 (103-4) xor 2 = 99 xor 2 = 0110 0011 xor 0010 = 0110 0001 = 97잉 된다. 따라서 g일때 97에 해당하는 문자열인 a를 입력하면 된다고 한다...
이문제는 x64dbg에서만 확인하는 것이 아닌 코드를 짜서 쉽게 계산해 푸는 문제인 것을 확인 할 수있었다
블로그에서 참고하여 코드를 짰다..
I_am_X0_xo_Xor_eXcit1ng
밑에 참고 블로그를 통해 문제를 해결 할 수 있었다. 도저히 혼자 봐서는 문제를 풀 수없었다......
일단 블로그의 도움으로 이해를 하며 따라가고 더 공부를 하며 다시 혼자 풀어볼 예정이다..
참고