#5.Replace 풀이.
Download Link => http://reversing.kr/challenge.php
일단 파일을 다운로드해서 열어본다.
임의로 allblack이라는 문자를 입력하고, Check를 누르니
오류 메시지가 뜨면서 Replace.exe가 강제 종료 된다.
일단 ExeinfoPE를 실행해본다.
C++로 구성되어 있고, 패킹이 되어 있지 않다라는 정보 정도를 알 수 O.
일단 Ollydbg로 실행해본다.
일단 많은 함수 중에 눈에 들어 오는 건 GetDIgItemInt라는 함수가 보인다.
간단히 말해 단어 뜻 그대로 숫자를 받아오는 함수.
애초에 Replace.exe에는 숫자만 입력이 가능했던 것이다.
일단 BP를 걸고 확인해본다.
GetDIgItemInt 함수에서 BP를 걸었더니, 즉 받아온 숫자를 아래 MOV를 통해
4084D0에 저장하고, 0040466F를 CALL한다.
XOR 연산을 하고 EAX를 00404690로 점프하고, 00401084로 점프한다.
일단 0040466F로 들어가본다.
0040466F 부분.
아까 위에서 말했던 EAX, 즉 4084D0을 가지고 ADD 연산을 진행.
즉 코드가 바뀌는 부분이 40466F.
BP가 걸린 부분 아래에서 C39000C6을 40466F에 저장하면서 40466F의 코드가 바뀐다.
좀 더 보자면 0x90을 EAX에 저장하고, 바로 이 부분이 Error를 발생시키는 부분.
Error 이유는 EAX 값이 4084D0의 값이기 때문이다.
즉 4084D0의 값을 주소로 해서 0x90을 저장하는데 4084D0의 값이 601605CB라고 했기에
0x90을 저장을 못한다. 그래서 Error가 발생한다.
결국 이 문제의 관건은 4084D0의 값은 입력 값을 통해 변경이 가능하기에 변경해서 Error가 나지 않도록 하면 된다.
위에서 보면 4084d0에 저장된 값을 +1 하는 것을 알 수 O.
40466F 부분을 자세히 보면 EAX에 0x90을 저장.
0x90는 알다시피 NOP이라는 뜻.
이 말은 즉슨 바뀐 EAX에 따라 명령어가 NOP으로 변경된다는 소리.
결국 Correct라는 메시지를 띄우기 위해서는 한 가지 명령어를 더 우회해야 한다.
아까 화면으로 돌아가서 보면 마지막 JMP이 있는데 401071에 위치.
이것 때문에 SetDIgItemTextA라는 함수가 실행이 X.
이것만 해결할 수 있다면 Correct를 띄울 수 있을 것이다.
0040466F 부분에서 EAX를 NOP으로 채워주는 걸 이용하면 된다.
EAX에 00401071을 저장할 수 있도록 하면 NOP으로 채워주고 문제가 풀린다.
INPUT + 4 + 601605C7 = 401071
INPUT + 0x601605CB = 0x401071
INPUT = > 0xA02A0AA6 => 2687109798.
Cf) EAX 확인.
첫 번째 EAX는 601605CC.
두 번째 EAX는 601605CD.
세 번째 EAX는 601605CE.
1을 넣으면 0x601605CB + 0x1.
2을 넣으면 0x601605CB + 0x2.
3을 넣으면 0x601605CB + 0x3.
인증(=Auth)해본다.
어셈블리어 코드를 좀 더 잘 볼 줄 알아야겠다..
'# Related site issues > Reversing.kr' 카테고리의 다른 글
#7.Position. (0) | 2018.05.20 |
---|---|
#6.ImagePrc. (0) | 2018.05.20 |
#4.Music Player. (0) | 2018.05.19 |
#3.Easy Unpack. (0) | 2018.05.18 |
#2.Easy Keygen. (0) | 2018.05.18 |