수업 시간에 맵핵을 만들었다. 추가로 무적 핵을 만들면 재밌을 것 같아 추가 학습을 진행하고 기록하겠다.
단순히 무적 핵은 너무 쉽게 구현할 것 같아 On/Off가 가능하도록 구현하였다.
폭탄 클릭 시 패배 로직 추적
폭탄을 클릭하면 터지는 소리와 함께 게임을 지게 된다. 따라서 펑 소리를 호출하는 함수를 바탕으로 하여 비교 로직들에 브포를 걸어 기능을 확인했다.

여기서 1B0, 1B1, 1B2가 소리를 설정하는 부분이다. 확인 결과 IB2로 설정되면 펑 터지는 소리가 들린다.

100352f에서 터질 때 비교하는 로직이 수행되는 것으로 보인다. 오른쪽 지뢰찾기 프로그램을 보면 폭탄을 클릭했는데 눌리지 않고 브포에 걸린 것을 알 수 있다. 이 부분에 jmp를 넣고 code cave를 통해 무적이면 죽지 않고 무적이 아니면 원래 흐름으로 돌아와 죽도록 하는 로직을 구상해볼 수 있다.
무적 로직

7FFB0000에 무적인지 아닌지 비교하는 값을 넣기로 했다. 기본값인 0이 무적 상태, 1이 무적이 아닌 상태다. 밑에 cmp는 원래 흐름을 해치지 않으려고 그대로 넣은 것이다. 빼도 정상적으로 동작하는 것은 확인했다.
무적인데 폭탄을 클릭했을 경우, 폭탄을 클릭하지 않았을 때 로직으로 jmp하도록 구성했다.
무적 On/Off 기능 구현

무적 On/Off는 [도움말] -> [지뢰찾기 정보]를 누르는 것으로 On/Off를 설정할 수 있도록 구현했다.

해당 어셈블리 코드는 모듈에서 user32를 전부 브레이크 포인트 걸면서 확인해봤다. 호출되는 곳은 호출 되었을 때 return address가 스택에 저장되어 있는 것을 이용해 찾아갈 수 있다.

변수와 변경 로직은 앞선 무적 확인 로직과 비교하여 위치 차이가 많이 나는 것을 볼 수 있다. 위치 확인 로직 바로 밑에 변수를 사용하니 읽고 쓰는 것에 문제가 발생하였다.
이에 찾아보니 읽기, 쓰기 권한이 없는 곳을 사용하였기 때문인 것을 알 수 있었다.

따라서 메모리맵을 통해 읽기, 쓰기가 가능한 사용자 영역을 찾아 code cave로 활용하였다.
결론

위와 같이 초급 뿐만 아니라 중급, 고급에서도 동작하는 것을 확인할 수 있다.
수업 외에 혼자 실습하니 수업에서 배우지 못한 디테일한 부분까지 공부할 수 있었다. 읽기, 쓰기 권한이 없어서 프로그램이 자꾸 꺼지는 것에서 막혔었는데 메모리 맵을 통해 해결할 수 있음을 배웠다.
'시큐아' 카테고리의 다른 글
| NT Header, Image Section Header, IAT란? (0) | 2025.07.21 |
|---|---|
| AWS WAF + Load Balancer 적용 실습 (2) | 2025.07.11 |
| [시큐아] 정보보호 개론 (0) | 2025.07.10 |
| [온택트 융합보안] 리눅스 기초 (0) | 2025.07.05 |