Be myself :: Be myself

달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

포인트---------

gdb로 까봐서 print system함수로 함수 주소 얻은 다음 system함수에 위치한 /bin/sh문자열 찾는 코드

int main(int argc, char **argv)

{ long shell; shell = 0x4006b498; // <=== system()함수의 주소 while(memcmp((void*)shell,"/bin/sh",8)) shell++; printf("\"/bin/sh\" is at 0x%x\n",shell); printf("print %s\n",shell); }

[mutacker@note myshell]$ gcc -o findsh findsh.c [mutacker@note myshell]$ ./findsh "/bin/sh" is at 0x4012eca9


출처: http://www.hackerschool.org/HS_Boards/data/Lib_system/rtl_sc.txt


참고: http://www.hackerschool.org/HS_Boards/data/Lib_system/framepointer.txt (Fake ebp 관련 공격)


'Exploit' 카테고리의 다른 글

스택 보호기법  (2) 2014.09.22
Double free exploit  (0) 2014.09.17
유니코드 익스플로잇  (0) 2014.07.21
SEH overwrite 실습  (0) 2014.07.16
C++에서 VTable  (0) 2014.07.12
Posted by flack3r
|

지뢰 찾기 핵

Reversing 2014. 7. 29. 10:38

<지뢰 찾기 패치>

윈도우 xp 시리즈 지뢰 찾기를 시작할 때 지뢰가 보이도록 패치 해 보겠다.

사용한 툴은 오직 OllyDbg뿐이다.

자, 일단 올리디버거로 실행시키고 F8로 쭉~ 따라 가다 보면 다음과 같은 루틴을 만난다.


1005330이 0이 될 때까지 반복하는 구간인데, 초급 난이도에서 지뢰가 10개임을 생각하면 10개만큼의 지뢰를 배치하는 것 같다. 사실, 이 루틴을 찾는 방법은 그냥 무작정 F8로써 분석해 가면서 찾아도 되는데, 나 같은 경우는 srand()함수 부분을 먼저 찾았다. (지뢰가 무작위로 배치될 것이기 때문에 이 부분위주로 찾으면 지뢰가 배치되는 부분을 찾을 수 있다.) 그 후 이 부분 위주로 분석하고 지뢰를 밟았을 때, 지뢰를 보여주는 함수를 찾았고, 이 부분으로 Jmp하게 해서(인라인 패치를 통해) 지뢰가 시작할 때 보여지도록 했다.

아무튼, 위 그림 부분을 하나하나 분석하다 보면 메모리에 다음과 같은 값들이 써진다.

지뢰의 개수를 나타내는 곳은 0x1005334부분이고 이 메모리 근처에 지뢰를 배치하는 판(?)을 그리는 것 같다. 지뢰가 위치하는 곳은 0x8F로 표시하는 듯 하다. 따라서 게임이 끝났을 때, 지뢰가 있는 부분을 표시하기 위하여 0x8F부분에 반드시 접근할 것이므로 저 부분에 하드웨어 브레이크 포인트를 걸어 실행 후 지뢰를 밟으면 지뢰를 보여주는 함수가 나온다.!!


0x1002F80 으로 시작되는 함수이다. 자 그럼, 우린 지뢰를 배치하고, 화면에 뿌리고 그 이후에 사용자의 입력 값을(클릭하는 것) 받는 루틴에서 잠깐 프로그램의 실행을 0x1002F80으로 돌리고 다시 원래의 실행을 하면 지뢰를 보는 상태로 게임을 할 수 있다. 그래서 다음과 같이 패치하자.

(사용자의 입력 값을 받는 루틴이다.)

여기서 우린 0x1002380부분에서 패치를 할 것이다. (이 부분에 패치를 하는 이유는 JMP명령어가 5바이트를 차지하므로 적당한 부분을 고른 것일 뿐이다.) 다음과 같이 바꾸자

이제 오른쪽 클릭-> Copy to executable -> All modifications 을 누른 후 오른쪽 클릭 -> save file을 눌러 패치 파일을 저장하면 모든 패치가 끝나게 된다.

'Reversing' 카테고리의 다른 글

vmware 디버깅  (0) 2015.01.28
peda 설치법  (0) 2014.10.17
치트엔진을 활용한 환세취호전 핵  (2) 2014.07.28
DLL Injection  (1) 2014.05.17
PEB를 활용한 안티디버깅  (0) 2014.05.16
Posted by flack3r
|

환세취호전 핵 만들기

오랜만에 고전게임이 생각나서 환세취호전을 했는데 너무 재미있었다. 그래서 핵까지 만들게 되었다. ㅋㅋㅋ

사용한 툴은 OllyDbg와 치트엔진 그리고 환세취호전을 창모드로 만들어 주는 인터넷에서 돌아다니는 툴을 사용했다. 핵이 적용된 save파일은 밑에서 다운받자.


savedat2.dat

환세취호전.zip


자 일단, 핵을 만들기 전에 한번 게임 해봐야 할 것 같아 한번 켰더니 '켠킴에 왕까지' 프로그램 빙의되서 엔딩까지 보고 말았다. ㅋㅋㅋ

음. 암튼 치트 엔진을 키고! 일단 돈부터 조작해보자.

돈에 해당하는 값을 입력하고 First Scan을 누르고 224의 값을 가진 주소값(변수)들을 전부 출력한다.

그 후 몬스터 한 마리 잡고 돈이 올라갔을 때, Scan Type에 Changed value를 선택하고 First Scan옆에 있는 Next Scan을 누른 후 값이 변한 변수들을 확인해서 현재 돈과 같은 값을 가지는 변수를 찾는다. 그것이 바로 돈의 변수 주소 값이다.


(첫 번째 스캔 눌렀을 때)


(두 번째 scan)

이러한 원리로 체력, 기력, 공격력, 방어력 등의 변수의 주소 값을 구할 수 있다. (레벨업을 하면 이 값이 변동되므로 변한 값 위주로 scan해서 파악함.) 주의할 점은 캐릭터들의 능력 치는 구조체 형식으로 저장이 되어 있을 것임을 예측 할 수 있다. 따라서 캐릭터 별로 능력치의 값들은 서로 가까운 주소 값에 몰려 있을 거라 생각할 수 있다. 돈을 가진 변수 또한 마찬가지 이므로 값을 찾을 때 0x400000 부분의 주소 위주로 찾으면 쉽게 다 찾을 수 있다.

다음은 캐릭터 별 체력, 기력, 공격력, 방어력을 찾은 화면이다.

자 이제 캐릭터 별 레벨, 체력, 기력, 공격력, 방어력 을 완전히 통제할 수 있고, 사실 혼자 핵을 쓸려면 이대로 플레이 하면 된다. 하지만, 우린 다른 사람도 우리의 핵 패치를 이용하고 싶을 것이므로(그래야 할 텐데..) 범용성을 위해 어떤 프로그램이나 파일을 만들어야 한다.

생각을 해봤는데, DLL인젝션을 통해서 캐릭터 특성 값을 하나하나 변경할 수 있지만 너무 큰 프로젝트가 될 것 같고 간단하게 특성 값들이 조작된 Save파일을 만든다면, 다른 사람들도 Save파일을 불러오기만 하면 거의 무적이 된 게임 캐릭터들을 만나볼 수 있을 것이다. ㅎㅎ

그럼 Save파일을 불러와 그 구조를 확인하자.

흠.. 그냥 이렇게 봐선 뭐가 뭔지 모른다. 그렇지만, 어떤 덩어리(패턴)등이 3번 반복되는 것을 볼 수 있는데(화면엔 2덩어리 밖에 안 잡혔다.) 게임에서 우리가 플레이 하는 캐릭터가 3명임을 감안 할 때, 이 덩어리들은 각 캐릭터들의 특성을 저장한 구조체임을 추측 할 수 있다.

이를 더 확실히 하기 위해 OllyDbg를 열고 치트엔진으로 확인한 변수들의 주소 값을 확인해 어떠한 형태로 캐릭터 특성 값들이 저장되는지 확인 해 봐서 Save파일과 비교한 후 Save파일의 어떤 부분의 값이 무엇을 뜻하는지 확인하는 과정을 거치고 알아 낸 후 조작하고 파일을 저장하면 끝이다. ㅋㅋㅋ 무슨 말인지 몰라도 상관없다. 다음의 그림들을 보면 확실히 알 것이다.

아타호의 level은 0x457756주소에 2Byte형태로 저장되어 있다. 이를 올리디버거로 확인 해 보면 다음과 같다.

0x457756 부분을 확인 해 보면 저런 식으로 값이 들어가 있다. [01 00]->아타호 레벨 부분이고 다음 [1E 00 1E 00 1E 00] 부분은 아타호의 체력과 관계된 부분이다. 근데 위에 빨간색으로 표시된 부분은 어디서 많이 본 것 같지 않나? 그렇다. 아까 save파일에 덩어리 부분의 일부이다.

위의 offset값 0x11A 부분부터 올리디버거로 확인한 저 빨간색 블록과 비교해 보자.

거의 똑같지 않나? 그렇다. 올리디버거에서 확인한 구조체 부분과 save파일의 구조체부분이 다르지 않다는 것이다. 그렇다는 것은 치트엔진과 Ollydbg를 이용해 save파일에서 캐릭터들의 특성 값이 어디에 위치하는지 알아 낼 수 있다는 것을 의미한다.

그래서 하나하나 알아보면 다음과 같다.

여기서 공격력-update와 방어력-update부분은 레벨업 시 레벨업을 처리하는 함수가 참조하는 부분인데, 이 부분을 조작하지 않으면 캐릭터가 레벨 업을 할 때 애써 조작한 공격력이나 방어력이 원래대로 돌아가 버린다. 암튼 위에 부분의 구조는 아타호의 값들인데 다른 캐릭터들의 특성값들도 동일한 구조로 저장되어 있으므로 여기까지 이해 했다면 나머지 린샹이나 스마슈의 특성값들은 쉽게 찾을 수 있을 것이다.

다음은 내가 파악한 값들이다.

<raw 0x8>

4바이트 -> 돈

--------------------아타호------------------

<0x457756>

<raw 11a>

첫째 2바이트 -> 레벨

둘째 2바이트*3 ->체력

셋째 2바이트*3 ->마나

 

<raw 142>

2바이트 -> 공격력

 

<raw 146>

첫째 2바이트 -> 방어력

 

<0x45780E>

<raw 304>

첫째 2바이트->공격력 업데이트

<raw 308>

첫째 바이트 ->방어력 업데이트

--------------------------------------------

 

-------------------린샹---------------------

<0x45782E>

<raw 0x320>

첫째 2바이트 -> 레벨

둘째 2바이트*3 -> hp

셋째 2바이트*3 -> mp

 

<0x457844>

<raw 0x358>

첫째 2바이트 -> 공격력

+2바이트

둘째 2바이트 -> 방어력

 

<raw 0x51a>

첫째 2바이트 -> 공격력 업데이트

+2바이트

둘째 2바이트 -> 방어력 업데이트

-----------------------------------------

 

------------------스마슈--------------------

<0x457906>

<raw 54c>

첫쨰 2바이트 ->레벨

둘째 2바이트*3 ->hp

둘째 2바이트*3 ->mp

 

<raw 574>

첫째 2바이트 ->공격력

+2바이트

둘째 2바이트 ->방어력

 

<raw 736>

첫째 2바이트 -> 공격력 업데이트

둘째 2바이트 -> 방어력 업데이트

자, 이렇게 해서 레벨, 체력, 공격력 등을 조작해서 자기가 원하는 값으로 세팅한 후 저장하면 트레이너 save파일이 만들어 진다. ㅎㅎ

완성된 save 파일을 로드 했을 때의 사진이다.

'Reversing' 카테고리의 다른 글

peda 설치법  (0) 2014.10.17
지뢰 찾기 핵  (1) 2014.07.29
DLL Injection  (1) 2014.05.17
PEB를 활용한 안티디버깅  (0) 2014.05.16
WinDbg, xp 연동  (0) 2014.05.16
Posted by flack3r
|