본문 바로가기

Wargame/Reversing.kr

[Reversing.kr] Replace

5번째 문제 Replace 입니다.

문자는 입력할 수 없고 오로지 숫자만을 입력할 수 있는 프로그램이네요.

문제 파일에 ReadMe 텍스트 파일이 포함되어 있지 않는 것을 보아

입력하는 숫자가 문제의 정답임이 확실할 거 같습니다.

 

이상하게도 문제의 프로그램에 알맞지 않은 숫자를 입력한다면

비정상적으로 예외가 발생하여 프로그램이 종료되는 현상을 보실 수 있습니다.

예를 들어 1234 라는 숫자를 입력했을 때 발생되는 예외를

디버거를 통해 확인해보도록 하겠습니다.

0x0040466F에 있는 mov byte ptr ds:[eax], 90 인스트럭션에서

EAX 값 0x60160A9D에 0x90을 넣으려고 했지만

0x60160A9D 아직 매핑되지 않는 주소이므로

EXCEPTION_ACCESS_VIOLATION 예외가 발생된 것을 알 수 있습니다.

문제를 풀이하고 있는 환경에 의해 예외가 발생한 것인지

혹은 잘못된 숫자를 입력해서인지를 확인해 봅시다.


0x60160A9D, 0x6017E6BE, 0x601730D6, 0x601605D7

......


입력된 숫자에 의해 EAX 값이 변화하고 있음을 확인하였습니다.

그 뜻은 문제를 풀이하고 있는 환경에 의한 예외가 아닌

잘못된 숫자를 입력해서 예외가 발생했다는 뜻 입니다.

환경 탓이 아니었음을 확인했으니

다이얼로그 프로시저 0x00401020에서

Check 버튼을 눌렀을 때의 실행 흐름을 살펴 봅시다.

입력했던 숫자 문자열을 데이터 형식으로 바꾸기 위해서

GetDlgItemInt() API를 사용하여 입력했던

숫자 문자열을 데이터 형식으로 변환시키고 0x004084D0 메모리에 넣습니다.

그리고 0x0040466F 함수를 호출하게 되는데

흐름이 복잡하므로 핵심적인 인스트럭션만 살펴보도록 하죠.


inc dword ptr ds:[0x004084D0]
inc dword ptr ds:[0x004084D0]
add dword ptr ds:[0x004084D0], 0x601605C7
inc dword ptr ds:[0x004084D0]
inc dword ptr ds:[0x004084D0]

mov eax, dword ptr ds:[0x004084D0]

mov byte ptr ds:[eax], 0x90

mov byte ptr ds:[eax], 0x90


간략히 요약하자면

입력했던 숫자 + 0x04 + 0x601605C7 메모리에

NOP(0x90)을 2바이트 쓴다는 의미인데

어떤 메모리 주소에 NOP 패치를 해야 할까요?

0x0040466F 함수를 호출하고 이후 정상적이라면 0x00401073 주소로 이동해야 하지만

0x00401071에 있는 JMP 인스트럭션 때문에 이동하지 못하는 상황입니다.

하지만 0x00401071 주소로 NOP 패치를 해준다면

화면에 표시된 Wrong이 Correct!로 바뀌지 않을까요?

 


입력했던 숫자 + 0x04 + 0x601605C7 = 0x00401071

입력했던 숫자 = 0x00401071 - 0x601605C7 - 0x04


위와 같은 수식으로 입력했던 숫자 2687109798를 구할 수 있으며

unsigned 방식으로 계산해야 한다는 점을 주의해야 합니다.

Replace의 정답은 2687109798 입니다.

'Wargame > Reversing.kr' 카테고리의 다른 글

[Reversing.kr] Music Player  (1) 2019.10.10
[Reversing.kr] Easy Unpack  (0) 2019.10.10
[Reversing.kr] Easy Keygen  (0) 2019.10.08
[Reversing.kr] Easy Crack  (0) 2019.10.08