요즘 치트엔진에 재미를 붙이면서 살다가
단순 변수값으로 메모리 찾기엔 조금 한계가 있다고 생각해서
직접 어셈블리어쪽을 만지면서 메모리를 조작해야겠다 마음을 먹어
코드엔진 사이트가서 문제를 풀어보기로 했습니다.
리버싱 툴은 치트엔진을 활용했습니다.(아직 초보기도 하고, 치트엔진이 가장 저한테 잘 맞는다고 생각했기 때문)
일단 이 유튜브를 통해 리버싱을 실습할 수 있는 사이트와 풀이까지 도움을 많이 받았습니다.
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가
확인 버튼을 누르면
에러 문구가 뜨는 것을 확인할 수 있었습니다.
일단 치트엔진에 Attach를 시킨 후, 메모리를 한번 보겠습니다.
여기서 cmp를 이용해 eax, esi 값을 비교해 zf flag 가 활성화 될 시 103D로 이동해 활성화가 되었다는 구문으로 이동하는 것으로 추측이 됩니다.
이 유튜브에서 쓴 방법은 cmp 구문에서 eip(다음 cpu가 실행하는 명령어의 주소를 가지고 있는 레지스터)를 조작하는 방법을 선택하였습니다.
치트엔진 상에서 메모리 부분을 우클릭 후 Change register at this location 선택 후, eip에 103D로 변경하였습니다.
결과
cmp가 c언어로 치면 if문과 비슷한 느낌이였고, break point를 걸어 확인해 본 결과 eax와 esi의 값이 달라 Error를 뿜는 것을 관찰할 수 있었습니다.
그래서 생각해 본 풀이 방법이 eax와 esi의 값을 같게 하면 좋은 결과를 만들 수 있지 않을까? 해서 이 방법으로도 풀어봤습니다.
eax 는 1이고
esi는 401003 이라는 값을 가지고 있습니다.
제가 여기서 생각한 방법은, 치트엔진 7단계에서 배웠던 코드 인젝션으로 esi의 값을 1로 바꿀 예정입니다.
우측 상단에 Tools -> Auto assemble 클릭
그 후, Template -> Code Injection 클릭
그 다음, 간단하게 esi를 1로 변경해주었습니다.
Run 결과 정상적으로 zf가 활성화되었습니다.