Reversing

[Reversing] Replace_WirteUp

오호츠크해 기단 2023. 5. 13. 21:16
728x90

워게임 풀이

http://reversing.kr

 

Reversing.Kr

This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil@reversing.kr

reversing.kr

 

6. Replace

 

문제 파일 압축을 풀어 실행해보면 위와 같은 화면이 실행된다.

숫자만 입력할 수 있고(숫자가 아닌 값을 입력하면 그냥 종료됨), 입력값을 넣으면 그냥 종료된다.

 

아무 값이나 넣고 실행시키면

0040466F에서는 EAX에 0x90(NOP)을 저장하고, 여기서 문제가 발생한다.

 

왜냐하면 현재 EAX에 저장되어 있는 주소인 601605E9는 접근할 수 없는 주소이기 때문이다. 접근할 수 없는 곳에 0x90이라는 값을 넣으려고 하니 오류가 나는 것이다.

 

 

String에서 수를 입력받는 부분을 찾았다. GetDigItemInt로 int(수)를 받아오고 있다.

40105A에 BP를 걸고 실행하겠다.

 

40105A에서 멈췄다.

 

40105A: 숫자를 입력받고, 16진수로 변환 후 EAX에 저장

401060: 0x4084D0에 EAX 값 저장

401065: 40466FF 함수 호출

40466F 함수를 호출했으므로 40466F 함수는 어떤 것을 수행하는지 알아볼 것이다.

40466F


[0x40466F]

 

40467A 호출, 4084D0 += 601605C7

0x404689 호출, 4084D0 =1

RETN, 4084D0 +2

40466F: 40467A 함수 호출

 

40467A: 61906EB의 값을 406016 주소에 넣음

404684: 40489 함수 호출

404689: 0x4084D0 주소의 값 1 증가 (INC는 피연산자 값 1 증가)

40468F: 404689로 돌아가서 다시 한 번 더 0x4084D0 주소의 값 1증가 후 404674 주소로 RETN (CALL을 통해 호출된 함수에서 다시 복귀하기 위해 사용하는 명령)


[ 0x40467A ]

 

4084D0 + 3, RETN 후 다시 4084D0 + 4


[ 0x404690 ]

 

4084D0 ( 0x601605C7 + 4 + 입력값 )  eax 에 옮기고,

0x404689 호출 ( 4084D0 + 1 )

그리고 0x40466F 함수에 C39000C6 덮어씀

RUN을 누르니 함수가 변했다.

eax 값에 90(NOP)을 넣고 리턴

0x40466F 함수 호출 후, EAX +1 , 다시호출

6E8 을다시넣어서 함수복구,

0x401071로 점프

하지만, 임의의 주소에 NOP을 쓰니 오류가 발생하는 것 같다.


[ 0x401071 ]

 

ollydg

0x401084 로 점프한다. (EndDialog)

x32dg

추가로 401073이 Correct라는 걸 확인

 

 

함수분석을 통해,  0x601605C7 + 4 + X , 0x601605C7 + 5 + X 에 

각각 90 (NOP) 을 쓸 수 있다는 것을 알았다.

401071 에 EB 11 (JMP SHORT 00401084) 을 90 90 으로 만들면

JMP 문 밑에있는 Correct 세팅함수가 실행될것이다.

 

 

0x601605C7 + 4 + X = 0x401071 이 되어야한다.

X = 0x401071 - 4 - 0x601605C7

X 의 값이다. 주소값은 8byte 이기때문에

A02A0AA6 만 있으면 된다.

입력하는 것이 int형 이므로

10진수로 변환 ->  2687109798