[xcz.kr] prob30
http://xcz.kr/START/prob/prob30.php
http://xcz.kr/START/prob/prob30.php
xcz.kr
30번 리버싱 문제
exe 파일 대신 dll 파일이 주어진다.
dll 파일이다보니 실행 동작을 예측할 수는 없고
디스어셈블된 코드를 따라가보면서 이해해보려고 했는데 디버거에 넣자마자
덤프 창에 대놓고 the key is라는 문자열이 들어있다.
해당 주소 6A3BD000을 참조하는 장소를 찾아서 breakpoint를 걸고 실행시키면 키가 나올 듯
Search for -> All Text string ... 로 들어가서 실행 중에 나타난 문자열 리스트를 확인한다.
더블클릭하면 해당 문자열이 나타난 주소로 이동한다.
the key is %s 문자열은 6A3A1365에서 나타났다.
breakpoint 걸고 F9로 실행시켜도 바로 이동하지는 않더라..
하긴 그렇게 쉽게 만들었을리가
목표 주소를 놓고 어디에서 이 부분을 참조하는지 주변에서 역으로 진입해보는 방법을 사용하기로 함..
the key is %s 부분을 포함하는 함수 시작 주소는 6A9712B0이다.
함수가 시작되는 6A9712B0을 클릭하고
덤프 window와 코드 window 사이의 선을 드래그해 올리면 어디에서 참조되었는지 주소가 나온다.
조사하면서 알았는데 디버거에서 > 표시가 jump로 이동되었다는 의미라고 한다.
call 함수 호출로 이동하는 주소라면 $ 표시로 나타난다.
6A97100A는 6A9713DE에서 호출되었다.
이런 식으로 하나씩 거슬러 올라간다.
6A9713DE가 포함된 함수의 시작점은 6A971014에서 점프
6A971014는 6A971412에서 CALL
6A971412는 6A97140E에서 점프 (윗윗줄이다)
이 함수가 시작되는 부분은 6A971005에서 점프
6A971005는 6A9719D5, 6A9719E9 두 곳에서 호출되었다.
두 주소 직전에 점프되는 주소는 6A9719A2이다.
마지막으로 6A9719A2가 시작되는 콜은 <ModuleEntryPoint>+19에서 오고 있다.
<ModuleEntryPoint>는 6A971A64로 19를 더한 주소는 6A971A7D이다.
경로를 찾았으니 역으로 들어가면 된다.
역으로 함수를 진행시켰을 때 the key is %s 직전에서 EDX에 key가 들어온다.
key : ekfldntmtkrldi
생각보다 번거로웠는데.. 함수 진행 플로우를 알아내도 JMP 구문이나 JNE 구문 적절히 제로 레지스터랑 주소 바꾸면서 진행해야 한다.