reversing.kr의 Replace를 풀어보았다. 일단 이 프로그램은 입력을 받고 맞는 값과 비교해서 Wrong이 옳은 값으로 된다는 것을 느낄 수 있다. 그리고 아무 값이나 넣어봤을때, 그냥 프로그램이 꺼졌다.
그래서 x32 dbg로 프로그램을 확인하였다. user32부분에서 DialogBoxParamA부터 EndDialog까지 사용된다.
여기서 GetDigItemInt 에서 사용자로부터 입력받는 부분임을 알 수 있다.
그래서 이부분에 break point를 걸었다.
그리고 그 함수 부분으로 가보니 입력한 값을 0x4084D0 부분에다가 넣는다는 것을 알 수 있다.
또한 성공하였을 시에 Wrong 부분이 Correct!로 바뀜을 확인할 수 있다.
그리고 correct문으로 가기위해서는 jmp구간을 어떻게 해야함을 느낄 수 있었다.
그래서 replace.40466F 함수부분으로 들어가보았다.
값을 넣어주고 동적분석 스타트!
하지만 0040466F에서 오류가 난다. 그래서 저 부분에도 breakpoint를 걸어주고 다시 동적 분석을 하였다.
위를 돌려보면 처음에 입력값 + 601605c7을 해주고
call replace.404689부분에서 총 4번을 inc해준다. 그래서 최종적으로 eax값에 들어간다.
그래서 이 녀석을 이용해서 주소 eax에다가 0x90을 넣어준다.
처음에는 이게 뭐하는 건지 몰라서 시간낭비만 하였다. 그러다가 0x90을 검색해보았다.
알고보니 0x90은 NOP이였다.... OTL 이걸 몰라서 정말 오래걸렸다. ㅠㅠㅠ
그리고 다음 함수가 끝난 부분을 보면
jmp replace.401071로 향한다. 이 부분은 Correct의 바로 윗부분 jmp부분이다.
즉, 401071주소 부분을 NOP으로 바꿔주면 된다!!
따라서, 입력값 + 601605c7 + 4 = 401071이 되어야 한다.
입력값 = 401071 -4 -601605c7
위의 계산결과에서 앞의 F를 빼주면 A02A0AA6 이다.
나온 hex값을 10진수 값으로 바꾸면 위와 같은 값이 나온다. 즉! 정답이다.
위와같이 확인 할 수 있다. 리버싱은 정말 알아야할 것이 많은 것같다...
참고 : https://ko.wikipedia.org/wiki/NOP
NOP - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
'hacking > reversing' 카테고리의 다른 글
reversing.kr : musicPlayer (0) | 2020.02.06 |
---|---|
reversing.kr : Easy UnpackMe (0) | 2020.02.05 |
codeengn : crackme 1 (0) | 2020.02.04 |