[Reversing.kr] Replace

semon·2022년 11월 3일
0

Reversing

목록 보기
5/10

문제

reversing.kr의 Replace문제입니다.

실행을 시켜보면 입력을 받고 Check 버튼을 누르면 맞는지 확인을 하는 프로그램인걸 알 수 있습니다.

분석

IDA를 활용하여 Correct message가 나오는 부분을 확인해보니

당장 Correct를 호출하는 부분으로 jmp를 하는 부분이 없는 걸 확인할 수 있습니다.

어셈블리 코드를 보면 00401071의 jmp로 인해 correct를 출력하는 부분이 실행이 안 되는 것을 볼 수 있습니다. 해당 함수의 시작 부분에 break point를 걸고 입력으로 12345를 주고 실행을 시켜보면

다음과 같이 eax 값을 004084d0에 저장하는데 이 값은 3039이고 이는 입력값으로 준 12345입니다. (eax = 0x004084d0 = 0x3039(12345))

그 후 해당 부분에서 004084d0의 값을 두 번 증가시킵니다.
(eax = 0x3039(12345), 0x004084d0 = 0x3039(12345)+2)

계속 실행을 시켜보면 해당 부분에서 또 연산이 있습니다. eax는 1 증가시키고 004084d0의 값은 601605c7만큼 증가시킵니다.
(eax = 0x303a, 0x004084d0 = 0x3039(12345) + 2 + 0x601605c7)

또 해당 부분을 다시 거치면서 다시 한번 004084d0의 값을 증가시킵니다.
(eax = 0x303a, 0x004084d0 = 0x3039(12345) + 2 + 0x601605c7 + 1)

다음으로 해당 부분에서 eax의 값을 004084d0의 값과 같게 만들고 1 증가시킵니다.
(eax = 0x004084d0 = 0x3039(12345) + 2 + 0x601605c7 + 1 + 1, 0x004084d0 = 0x3039(12345) + 2 + 0x601605c7 + 1)

이후에 해당 부분에서 40466f의 값을 0c39000c6으로 바꾸어주고 40466f를 호출합니다.
이때 0c39000c6은 어셈블리어로 mov byte ptr[eax], 0x90(nop)입니다.

위에서의 명령으로 인해 eax의 값에 해당하는 주소는 0x90(nop)을 갖게 됩니다.

이때 eax의 해당하는 값을 00401071 즉 correct가 실행이 안되도록 jmp 하는 부분으로 설정하면 correct를 실행시킬 수 있을 것 같습니다.

(입력값) + 2 + 0x601605C7 + 1 +1 =0x00401071이어야 하므로
따라서, (입력값) = 0xA02A0AA6 10진수로 바꾸면 2687109798 값입니다.
이를 입력 값으로 주면 정답임을 알 수 있고 결과적으로 이 값이 정답이었습니다.

profile
보안을 공부합니다

0개의 댓글