블로그 이전했습니다. https://jeongzero.oopy.io/
[reversing.kr] Replace
본문 바로가기
워게임/reversing.kr

[reversing.kr] Replace

728x90

1. 문제


1) 문제 확인

숫자를 입력하고 check를 누르면 바로 꺼진다. 원래 꺼지는건지 아니면 에러뜨는건지...

여튼 Wrong이 아닌 정답숫자를 입력하면 되는거 같다. 문자열을 한번 검색해서 시작해보자

2) 흐름 파악

우선 그냥 디버거에서 실행시키면 0x40466f 주소에서 에러가 발생한다. eax의 주소에 0x90을 넣으려고 하는데 해당 주소는 찾을수 없는 주소이다. eax에 값이 어떻게 들어가는지를 추적하는걸로 시작하면 될것 같다

2. 접근방법


Graph view를 보면 0x40466f가 3번 호출되는 걸 볼 수 있다. 그리고 우측 하단에 Correct 문자열을 저장하여 출력해주는 함수가 보인다. 현재는 분기문이 절로 없어서 코드패치를 해야하나.. 분석을 해보자. 우리가 입력을 할수 있는 함수는 GetDigItemInt 함수이다.

입력값을 0x4084d0에 저장을 하고 0x4066f를 호출한다

  • 0x4066f 내부에서 0x40467a 를 또 호출한다.
  • 0x406016에 0x619060EB 를 복사
  • 0x4084d0에 들어있는 값을 + 1 한다. // 이는 입력한 값이 들어있다
  • 한번더 + 1 한다 // 이건 디버깅하다보니 그럼
  • 0x4066f 의 처리를 다하고 ret된다.

  • 이번엔 0x4084D0(입력값 + 2)에 들어있는 값과 0x601605c7 이거를 더한다.
  • eax를 1 증가한다. 현재 eax는 입력값이다
  • 0x404689를 호출한다
  • 0x4084D0 에 들어있는 값을 + 1 시킨다. 따라서 0x4084D0에는 (입력값 + 2 + 0x601605c7 +1)
  • 한번더 + 1 한다 // (입력값 + 2 + 0x601605c7 +1)

  • 그다음 0x4048D0에 들어있는 값을 eax에 복사 한뒤, 0x404689를 호출한다
  • 0x404689에서는 한번더 + 1 한다 // (입력값 + 2 + 0x601605c7 +1 + 1)
  • 0x40466f에 0xc39000c6를 넣는다. 해당 값은 "mov byte ptr [eax],90h " 어셈을 뜻한다
  • 그리고 call 0x4066f를 한다.

  • 여기가 바로 아까 에러났던 부분이다.
  • eax에는 최종적으로 ( 입력값 + 2 + 0x601605c7 +1 + 1 ) 이 값이 들어간다. 여기를 참조가능한 주소로 넣으면 된다.

3. 풀이


그럼 어떤 값을 eax에 넣어줄까? [eax]에 0x90을 넣는걸 볼수 있는데, 코드 어느 부분을 Nop 으로 패치해야할까

그래프를 보면 0x40466ff로 0x90을 특정 주소바이트에 넣는다. 그리고 0x401071로 뛰는데

현재 0x401071에서는 곧바로 0x401084로 뛴다. 즉 Correct 출력로직은 건너뛴다. 따라서 2바이트의 Nop을 0x401071으로 패치 시키면 된다.

0x401071 (EB 11) ⇒ (90 90)

따라서

  • 입력값 + 2 + 0x601605c7 +1 + 1 = 0x401071
  • 입력값 = 0xA02A0AA6 (2687109798)

0x401071 2바이트가 0x90으로 패치되었고 Correct가 뜨게된다.

4. 몰랐던 개념


728x90

'워게임 > reversing.kr' 카테고리의 다른 글

[reversing.kr] Position  (0) 2020.12.16
[reversing.kr] ImagePrc  (0) 2020.12.15
[reversing.kr] Music Player.exe  (0) 2020.12.11
[reversing.kr] easy elf  (0) 2020.12.10
[reversing.kr] easy keygen  (0) 2020.12.08