리버싱

리버싱-6주차: 지뢰찾기 분석과 핵(OllyDbg)

jiwonniii 2026. 2. 26. 22:23

Be myself :: 지뢰 찾기 핵

 

지뢰 찾기 핵

윈도우 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를 한거는 소프트웨어브레이크포인트이다!

  1. 덤프창에서 타겟 선택 오른쪽 아래 덤프창(Hex dump)에서 아까 찾았던 지뢰 값인 8F 숫자 하나를 마우스 왼쪽 버튼으로 딱 한 번 클릭합니다. 그러면 그 숫자 배경이 회색으로 하이라이트 될 겁니다.
  2. 우클릭 메뉴 열기 숫자가 선택된 바로 그 상태에서 마우스 오른쪽 버튼을 클릭합니다.
  3. 덫 설치하기 (핵심) 길게 뜨는 메뉴 창에서 다음 순서대로 마우스를 이동해서 클릭합니다.
  • 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