바이너리 코드 변조
4번 강좌에서는 게임 코드를 찾는 것을 확인했는데요.
요번에는 코드를 변조하는 방법에 대해서 설명하겠습니다.
모 게임의 서명 확인 주소는 0x1024B1F7C 였습니다.
private bool CheckSignature(string fileName); // RVA: 0x1024B1F7C Offset: 0x24B1F7C
여기서 리턴 값이 bool로 되어있습니다.
만약 서명이 틀리면 false로 리턴할 것이고 맞으면 true로 리턴할 것입니다.
그렇다면 서명이 무조건 맞다고 하기 위해서는 true로 계속 리턴을 해줘야 합니다.
false의 값은 0이고 true의 값은 1 입니다.
여기서 아래 코드는 false로 리턴해주는 어셈블리 코드 입니다.
코드를 간단하게 설명하자면 W0 레지스터 값이며 W0에 0이라는 값을 넣습니다.
그리고 리턴을 해줍니다.
참고로 R0, W0와 같은 0번 레지스터의 경우 리턴 레지스터라고도 불립니다.
그렇다면 ture로 변경하려면
MOV W0, #1
RET
요렇게 변경이 필요합니다.
일단 포럼 여기저기 hex converter가 있어서 그것을 사용해 보겠습니다.
위에 결과를 보시면 0x20008052 0xc0035fd6인 것을 확인할 수 있으며 값을 변경해주면 됩니다.
이제 위에 있는 함수의 RVA 값이 아닌 바이너리의 Offset 0x24B1F7C 위치로 가보겠습니다.
hex 에디터를 열고 0x24B1F7C 위치로 점프합니다.
hex 에디터와 ida의 위치가 같은지 앞 부분의 byte 값을 확인합니다.
이제 ida로 와서 1로 리턴하는 코드를 확인합니다.
변조된 파일을 설치된 경로에 저장을 하고 실행을 합니다.
실행위치는 /var/containers/Bundle/Application/(bundle id)/(app name) 입니다.
ios 버전에 따라 다를 수 있으며 인터넷에서 찾아보고 저장해 주시면 됩니다.
이번 내용은 아주 기본적인 변조 내용입니다.
외국 아저씨들은 코드가 동작하지 않도록 nop 하시는 분들도 있고 void에서는 RET 하시는 분들도 있습니다.
해당 강좌는 변조 공부를 통해 ARM 어셈블리에 대해서 친숙하시길 바라며
보안솔루션이 들어간 앱의 경우는 무결성 검사를 하기 때문에 변조를 해도 탐지가 됩니다.