www.reversing.kr(Replace)풀이
먼저 ollydbg로 Replace.exe파일를 가져오면 다음과 같은 어셈블리 코드를 보실 수 있습니다. 여기서 조금 코드를 올려보도록 하겠습니다!
자 그러면 Correct라는 문자열를 보실 수 있습니다. 여기서 GetDIgItemInt라는 함수를 call 해줘서 사용자로부터 입력값을 받습니다. 따라서 여기에 브레이크 포인트(F9)을 걸어 주도록 하겠습니다. 00401060주소의 어셈블리를 보면 함수의 반환 값 EAX(사용자의 INPUT값이 기록됨)이 4084D0번지 주소에 저장됩니다.
보시다시피 입력값이 EAX 레지스터에 저장된다는 것을 확인 할 수 있습니다.
여기서 눈치가 빠르신 분들을 무언가를 짐작하 실 수 있습니다. 이후 CALL로 함수가 한 번도 호출되니까 입력된 값을 연산하게 된다는 것을 대충 짐작이 가늠합니다. 이제 여기서 F7로 스텝인투를 하도록 하겠습니다.
스텝인투를 하신 후에 다음과 같은 코드가 뜹니다. 여기서 다시 스텝인투를 하도록 하겠습니다.
스텝인투를 계속 진행해하겠습니다.
이제 4084D0(사용자의 INPUT값이 담겨 있음)를 보면 +1를 하는 것을 확인할 수 있습니다. 그리고 위에 보시면 601605C7이 더해지는 것을 보실 수 있습니다.
이것을 계속 스텝인투해서 계산해 보면 다음과 같은 결과를 얻을실 수 있습니다.
INPUT+1+1+601605C7+1+1
그리고 그렇게 계산된 값을 다시 EAX레지스터에 저장합니다.
그 후 계속 디버깅작업을 해주면 다음과 같은 코드를 만나 디버깅을 하지 못하게 됩니다. 이때 NOP로 바꾸면 정상적으로 진행됩니다.
여기서 보시면 EAX레지스터 값을 NOP로 채워주는데 여기서 생각을 전환해줘서 EAX레지스터 값에 00401071값을 넣어서 JMP문을 우회해줘서 CORRECT를 출력하면 어떨까?....
이제 INPUT+1+1+601605C7+1+1 = 00401071이라는 식을 세우고 INPUT 값을 계산해주면 됩니다. FLAG는 공개하지 않겠습니다.
EAX가 00401071값이 되면 00401071번지의 주소의 명령어를 NOP로 채워지기 때문에 밑에 사진과 같은 결과를 얻을 수 있습니다.