Step 5
우선 문제를 한 번 봐 봅시다. 이번에는 무엇을 요구할지..
우선 뭔 숫자가 있고 Change Value가 있습니다. 일단 저 숫자를 표기하는 곳을 찾으라는
얘기인데... Code Finder 기능을 이용하라 합니다. 이전 글에서 설명 했었던 Find out을
말하는걸테죠. 이 Find out이라는 기능은 어떤 주소에 담겨있는 Value가 있을텐데요.
그 Value에 접근하거나 사용하는 명령어들을 다 긁어와주는 아주 좋은 기능입니다.
우선 750을 스캔 후 Change Value를 눌러서 다음 숫자를 스캔하는 식으로 찾아봅시다.
일단 이렇게 찾았고.. 이 주소를 더블클릭 하면 밑의 Table로 내려집니다.
내린 후 이 주소에 우클릭을 하면 여러가지 옵션이 뜨는데 다음 중 하나를 누릅니다.
Find out what accesses를 누르거나 writes를 누르거나 둘 중 하나 누르시면 되는데
accesses는 주소 안의 내용이 바뀌지 않더라도 이 주소를 참조하는 모든 명령어를 긁는거고
writes는 주소 안의 내용을 바꿀 때 관여하는 명령어를 긁는겁니다.
즉 accesses가 좀 더 포괄적으로 긁어온다고 볼 수 있겠지요. 저는 accesess를 눌렀습니다.
누르고 나면 뭔가 창이 하나 뜰텐데 여기서 Change Value를 눌러보죠.
총 명령어 구간이 4개가 떴는데 주소들 봐서는 그냥 다 같은 함수인거 같습니다.
아무거나 하나 집어서 옆에 Show Disassembler 이걸 눌러줍시다.
빨간색 표시를 한 mov eax,[rax] 이 부분이 accesess 했을 때 나왔던 1번째 명령어 구간이고
바로 밑에 검은색 박스쪽에 jmp가 있습니다. 이 jmp를 따라가보죠.
빨간색 박스로 친 곳이 jmp 해서 넘어온 상태고 검은색 박스로 친 곳이 accesess에서 2번째 명령어네요.
일단 이 문제에서 요구하는 사항이 뭔지를 알아봅시다.
Click it and choose the Replace option to replace it with code that does nothing.
That will also add the code address to the code list in the Advanced Options window.
(Which gets saved if you save your table.)
이게 문제인거 같습니다. 그냥 간단하게 말하자면 Change Value를 누르면 계속 해서 Value가
바뀌고 있지 않습니까? Change Value를 눌러도 Value가 바뀌지 않게 하라는 뜻인거 같습니다.
아까 accesess를 했을 때 나왔던 1번째 명령어 쪽을 한 번 봅시다.
Tutorial-x86_64.exe+2CB08 - 8B 00 - mov eax,[rax]
Tutorial-x86_64.exe+2CB0A - 89 45 EC - mov [rbp-14],eax
Tutorial-x86_64.exe+2CB0D - B9 E8030000 - mov ecx,000003E8 { 1000 }
Tutorial-x86_64.exe+2CB12 - E8 F930FEFF - call Tutorial-x86_64.exe+FC10
Tutorial-x86_64.exe+2CB17 - 89 45 E8 - mov [rbp-18],eax
Tutorial-x86_64.exe+2CB1A - C7 45 E4 00000000 - mov [rbp-1C],00000000 { 0 }
Tutorial-x86_64.exe+2CB21 - EB 4D - jmp Tutorial-x86_64.exe+2CB70
이 구간인데, 밑의 jmp를 통해 01559190 이 주소에 Value를 넣어주는 것을 알 수 있습니다.
그러면 넣어줄 Value를 어디선가 계산을 하든가 랜덤으로 뽑아오든가 둘 중 하나일거란 말이죠.
그렇다면 남는건 call Tutorial-x86_64.exe+FC10 안에서 계산을 해온다는 걸 알 수 있습니다.
안의 함수를 살짝 봐보시면 알 수 있는데요.
여기서 이 call Tutorial-x86_64.exe+FB60 에서 계산을 한 후 결과값을 밑에서 쉬프트 연산 후 가져오네요.
이 로직은 제가 이전에 썼던 크랙미때처럼 계산 해보시면 도움이 될 거 같지만 이 문제를 푸는데에선
로직을 파악할 필요는 없기에 따로 다루진 않겠습니다.
제일 간단한 방법은 mov ecx,3E8 밑의 call Tutorial-x86_64.exe+FC10 이 명령어를 그냥 nop 처리를
해주는겁니다. nop이란 명령어는 아무것도 하지 않겠다라는 명령어에요.
Tutorial-x86_64.exe+2CB12에서 더블클릭을 하게 되면 명령어를 변경할 수 있습니다.
이것을 다 지우고 그냥 nop으로 변경 후 Ok를 누르면 됩니다.
그러면 nop이라는 명령어는 1Byte 길이고 call이라는 명령어는 5Byte 기준이기에 4Byte가 남습니다.
이 문구는 그 남은 4Byte도 다 nop처리를 할 건지를 물어보는겁니다. 당연히 Yes를 눌러줍니다.
안 눌러줄 경우 이런식으로 명령어 배열이 깨집니다.
이렇게 되고 Change Value를 누를 경우 무조건 크래쉬 뜨기 때문에 이런식으로 어셈 명령어 길이에
맞춰서 처리를 해주는 것이 상당히 중요하다고 볼 수 있겠습니다. 그런데 이렇게 nop으로 하고
Change Value를 눌렀지만 문제가 해결되지 않았습니다. 왜일까요?
nop 명령어 뒤에 있던 jmp를 타고 왔을때 조건문이 있던걸 보셨을거에요.
nop 처리를 하기 전에는 이 조건문을 타고 점프를 하지 않았는데 nop을 하게 되니 점프를 합니다.
나름의 검사 로직이 있는거라 볼 수 있겠네요.. 조건문을 타고 넘어가봅시다.
보니까 또 call Tutorial-x86_64.exe+FC10 이 부분을 호출하고 있음을 볼 수 있습니다.
그러면 여기 부분도 nop을 처리하고 Change Value를 눌러봅시다.
너의 방식은 튜토리얼을 망쳤다.. Ok를 누르면 데이터 충돌 위험이 있는데 무시한다..
프로그램을 꺼라.. 뭐 이런 말인거 같습니다.
즉 call 하는 함수를 nop 하는 식으로는 지네가 원하는 해결 방식이 아닌겁니다.
그러면 프로그램을 껐다가 다시 켜서 맞춰봅시다.
자 원래대로 첫번째 call문을 타고 넘어온 상태에서 봅시다.
빨간색 박스 쳐놓은게 Change Value 눌렀을 때 바뀌는 주소쪽입니다. 그리고 edx가 바뀌는 Value를 담고 있습니다.
그러니까 mov [rax],edx 이 명령어가 [rax] 안에 edx를 넣으란 소리죠. 그러면 그냥 이 명령어를 nop 해봅시다.
결국 옮기는걸 못하게 막아주면 끝이니까요.
이렇게 옮기는 구간 자체를 nop 해버리니 Change Value를 눌러도 바뀌지 않고 Next가 활성화 됐습니다.
그렇다면 아까 call 명령어를 nop 했을 때는 왜 저런 메시지가 뜬걸까요?
답은 이 부분에 있는데, 두개 다 nop을 해버리면 무한루프를 돌아버립니다.
그나마 튜토리얼 개발자가 스택 부분에서 루프 1바퀴 돌 때마다 1을 더하는 식으로 올리다가
100바퀴가 돌게 되면 에러 뜬거라 판단 하고 끄라고 하는 것입니다. 튜토리얼인데도 나름
배려를 해놓은거라 해야하나... 이번껀 기존 Step들과는 다르게 꽤 내용이 있는 편이네요.
'Reversing & Cheat Engine' 카테고리의 다른 글
34. Cheat Engine Tutorial 7 (0) | 2024.03.19 |
---|---|
33. Cheat Engine Tutorial 6 (0) | 2024.03.18 |
30. Cheat Engine Tutorial 3 (2) | 2024.03.15 |
29. Cheat Engine Tutorial 2 (0) | 2024.03.14 |
28. Cheat Engine Tutorial 1 (0) | 2024.03.14 |