지뢰 찾기 핵
윈도우 xp 시리즈 지뢰 찾기를 시작할 때 지뢰가 보이도록 패치 해 보겠다. 사용한 툴은 오직 OllyDbg뿐이다. 자, 일단 올리디버거로 실행시키고 F8로 쭉~ 따라 가다 보면 다음과 같은 루틴을 만난다
flack3r.tistory.com
참고 티스토리
지뢰찾기핵을 만들기 위해서 올리디버거가 사용되었다
올리디버거란?
32비트 프로그램 분석용 어셈블리 수준의 디버거
*OllyDbg vs. x32dbg
모두 32비트 실행파일 뜯어보고 분석할 수 있다 올리디버거는 2013년경 이후로 업뎃 멈춤 ㅠ 그이후 리버싱을 하는 사람들이 가장 기본적으로 사용하는 현역 표준 틀이다
자 이제 제대로 분석을 해보자
지뢰는 10개가 생성이 된다
f8로 하나하나 실행을 해보았다

bp를 걸어둔 저곳이 계속 반복되는 거를 알 수 있음
아 여기는 아니었음 무슨역할인지 나중에찾아봐야지
그리고 실행되기 이전에 지뢰가 미리 설정이 되어있을텐데요
f8로 계속 실행시키다 보면

rand함수를 찾을 수 있다

특히 이부분이 계속 반복됨
IDIV는 정수의 나누기를 실행하는것이다

즉 eax가 몫 edx는 나머지 이다
그리고 썻던 4바이트를 retn로 정리하는모습이다

f8로 실행을 시키다보니 이쪽부분이 계속반복되는 느낌
bp걸어놓은 저 사이를 한번 분석을 해볼까 합니다

- push Dword ptr ds:[머시꺵이]: 1005334덤프에 push하는것
- call winmine_.숫자: mine함수 부르기(여기에 rand가 있음)
- push Dword ptr ds[머시깽이]: 1005338덤프에 push하기
- mov esi eax: eax값을 esi에 이동
- inc esi: esi값 증가 뭔가 반복되는 변수이지 않을까(esi가 10이 될때까지??)
- call winmine: 이 함수 또부름
- inc eax: eax값 증가하기(아니 이건 머지 )

f8로 하나하나 실행해보았음
근데 실행할수록 ?가 하나씩 늘어난다
아마 그 폭탄이지 않을까
그리고 10036FD에서 ?가 추가되는것을알 수 있다

여기서 추가가됨
이거 찾다가 눈빠지는줄 (f8로 하나씩 실행하면서 찾아냈움!!!)
DEC 즉 값이 줄어드는데 왜 지뢰가 배치되는걸까요
1. DEC DWORD PTR DS:[1005330] 명령어 분석
DEX는 대상의 값을 1 감소시키는 명령어 이다 c언어에서 --랑 같음
DWORD PTR은 메모리에 접근할때 데이터 크기 지정(DWORD는 4바이트임)
DS(data segment)는 데이터가 들어있는 메모리 구역을 나타냄 따라서 괄호안에 있는거는 메모리 주소겠죠?
=> 결과적으로는 그 주소에 기록된 4바이트 정수값(10)을 읽어와 1을 뺀후 09로 업데이트하는 동작!!

그래서 10이여야할 숫자가 딱봤을때 1이길래 한번 반복끝나더니 반복문 탈출 하더라고요 이건 그럴거 같았음 당연함!
근데 문제는 내 추론은 ?가 지뢰라고 생각했는데 그래서 물음표개수를 셋더니 9개여야할 개수가 7개임 이건 모죠?
(내가 숫자를 잘못셋대요 덤프창 아래로 더 내려보니 ?가 더잇음 )
2. OR BYTE PTR DS:[EAX], 80 명령어 분석
자 이건또 뭐냐!
ㅇㅣ게 진짜 지뢰를 심는 동작인데요
OR비트 연산이다 즉 두 비트중 하나라도 1이되면 결과가 1이됨(당연함 )
이번 데이터 크기는 1바이트임(BYTE)
DS이건 위에서 나온 데이터 세그먼트 80이라는 값(이건 이진수로 10000000이다 즉 맨 앞자리 비트가 1이면 폭탄이 들어있다는 뜻으로 설계됨 후후
여기서 든 생각
왜 OR연산을 하나 헷갈리게 아니 1로 바꿔버리는 거면 MOV로 하면 되는거 아닐까...( 그냥 MOV BYTE PTR DS:[EAX], 8F)
만약 MOV명령어를 써서 강제로 8F로 덮어버려도 지뢰가 깔린것처럼 보일 수 있음 하지만 프로그램에서는 고유한 속성(뒤 1111)을 ㅇㅏㄴ전하게 보존하는 것을 선호한다
그래서 OR 연산을 씁니다.
- 기본 칸 (0x0F) : 0000 1111
- 지뢰 추가 (0x80) : 1000 0000 (OR 연산)
- 연산 결과 (0x8F) : 1000 1111
오홍!
딱 그럼 감이 오죠? EAX가 바로 그 머야 지뢰 위치 인게??
자 그리고 또 신기한 부분

옆에 게임을 실행해보았는데 저 누운 세모가 벽을 의미함 보니까 @@가 그 이미 확인된곳을 의미하는거 같음
@@다음 A가 있는데 A가 1을 의미하는거같아요 그옆에 ?가 있는데 역시 지뢰가 맞았음
옹
신기하다~!!
그래서 첫째줄 해석한김에 다음줄도 매칭 해보기로 했음
아아 누운 세모 앞뒤로 있으면 그 안에있는데 그 게임속에서 게임판인거임
( 누운 세모(10) 두 개가 양쪽에서 단단하게 벽을 쳐주고 있고, 그 벽과 벽 사이에 샌드위치처럼 쏙 들어있는 데이터들이 바로 우리가 화면에서 마우스로 클릭하는 실제 9x9 지뢰 게임판인 겁니다.)
나중에 복습할 강지원씨 한번 매칭 해보십쇼 그럼딱 맞는거를 알 수 있음~
자 이제 ?가 지뢰인거를 확실히 매칭햇죠?
자자 이제 핵을 만들어볼까요~??
위에 링크는 지뢰를 보이게하는 핵입니다 만들어보장

게임이 끝나면 1002F80으로 돌아온다 (bp를 걸어둿더니 일부로 지뢰를 밟았더니 여기서 bp걸림 히히)
내가 찾아야할 부분은 끝이나면 지뢰의 위치를 다 보여준다 이 부분을 바로
찾아야한다
2F80을 지나고 나면 한참 반복문을 반복한다


이렇게 바꿔보앗다

패치 완료 버전 히히 의도한 대로 지뢰가다 보이는 모습
근데 1002380은 머하는 곳이길래 왜 그곳을 바꾼걸까??
블로그에는 자세히 안알려줫당 내가 알아보자!
이거를 알아보려고 하니까 하드웨어 브레이크포인트가 필요하다는 것을 알 수 있었움!!
그동안 f2를 한거는 소프트웨어브레이크포인트이다!

- 덤프창에서 타겟 선택 오른쪽 아래 덤프창(Hex dump)에서 아까 찾았던 지뢰 값인 8F 숫자 하나를 마우스 왼쪽 버튼으로 딱 한 번 클릭합니다. 그러면 그 숫자 배경이 회색으로 하이라이트 될 겁니다.
- 우클릭 메뉴 열기 숫자가 선택된 바로 그 상태에서 마우스 오른쪽 버튼을 클릭합니다.
- 덫 설치하기 (핵심) 길게 뜨는 메뉴 창에서 다음 순서대로 마우스를 이동해서 클릭합니다.
- Breakpoint 에 마우스를 올립니다.
- 옆으로 메뉴가 열리면 Hardware, on access 에 마우스를 올립니다. (누가 접근하면 발동하라는 뜻입니다.)
- 마지막으로 Byte 를 클릭합니다. (우리가 선택한 8F가 1바이트짜리 데이터니까요.)
이 방식대로 해보니까 access하는곳에 다 bp가 걸리고 1002f80도 걸린다 유후~
'리버싱' 카테고리의 다른 글
| 리버싱 5주차-윈도우11 메모장 뜯어보기 (0) | 2026.02.21 |
|---|---|
| 리버싱 4주차 -IDA (0) | 2026.02.10 |
| 리버싱 3주차 과제 (0) | 2026.01.31 |
| 리버싱 2주차 과제 (0) | 2026.01.28 |
| 리버싱 1주차 과제 (0) | 2026.01.20 |