본문 바로가기
hacking/reversing

reversing.kr : Replace

by 스퀴시 2020. 2. 19.
728x90
SMALL

실행화면

reversing.kr의 Replace를 풀어보았다. 일단 이 프로그램은 입력을 받고 맞는 값과 비교해서 Wrong이 옳은 값으로 된다는 것을 느낄 수 있다. 그리고 아무 값이나 넣어봤을때, 그냥 프로그램이 꺼졌다.

 

dbg로 호출함수 확인

그래서 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을 검색해보았다.

NOP == 0x90

알고보니 0x90은 NOP이였다.... OTL 이걸 몰라서 정말 오래걸렸다. ㅠㅠㅠ

그리고 다음 함수가 끝난 부분을 보면 

jmp replace.401071로 향한다. 이 부분은 Correct의 바로 윗부분 jmp부분이다. 

즉, 401071주소 부분을 NOP으로 바꿔주면 된다!!

 

따라서, 입력값 +  601605c7 + 4 = 401071이 되어야 한다.

 

입력값 = 401071 -4 -601605c7 

계산결과

위의 계산결과에서 앞의 F를 빼주면 A02A0AA6 이다. 

 

최종값

나온 hex값을 10진수 값으로 바꾸면 위와 같은 값이 나온다. 즉! 정답이다.

clear

위와같이 확인 할 수 있다. 리버싱은 정말 알아야할 것이 많은 것같다...

 

참고 : https://ko.wikipedia.org/wiki/NOP 

 

NOP - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

LIST

'hacking > reversing' 카테고리의 다른 글

reversing.kr : musicPlayer  (0) 2020.02.06
reversing.kr : Easy UnpackMe  (0) 2020.02.05
codeengn : crackme 1  (0) 2020.02.04