코드엔진 level9

보안/리버싱 2017. 9. 5. 20:01


코드엔진 level9

: http://codeengn.com/challenges/basic/09





프로그램의 stolenByte를 구하라는 문제다.


stolenByte는 패커가 이동시킨 코드, 즉 EP의 코드 몇 개를 이동시킨 것이라고 생각하면 된다.


보호된 프로그램의 코드에서 윗부분을 이동시켰는데. 이부분의 명령어는 이동된 곳이나 할당


받은 메모리 공간에서 실행된다. 보호된 프로세스의 메모리가 덤프되었을 때 StolenByte를


복구하지 못한다면 덤프 된 실행파일은 작동하지 않는다.







처음 패킹되어 있는 상태로 프로그램을 실행하게 된다면 이런 문구를 출력을 하게 된다.


그리고 이 화면에서 확인 버튼을 누르면 다음 창이 뜬다.






하지만 언패킹을 하고 나서 프로그램을 실행시키면  다음 창이 뜬다.





이상한 문구를 뿌리면서 제대로 프로그램이 실행되지 않은 것을 확인할 수 있다.






패킹을 한 상태에서 프로그램을 올리 디버거로 실행을 하면 상단에 Nop의 문자가 뿌려지면서 messageBox 실행한다.




messagebox함수를 보면



int WINAPI MessageBox(HWND hWnd, LPCSTR lpszText, LPCSTR lpszCaption, UINT nType);


부분이다.


hWnd - 상위 윈도우의 핸들을 매개변수로 받는다.


lpszText - 출력할 메시지 문자열을 매개변수로 받는다.


lpszCaption - 메시지 박스의 타이틀에 나타날 문자열을 매개변수로 받는다.


nType - 메시지 박스의 동작방식, 아이콘 모양, 버튼의 종류를 지정한다.





위의 사진을 보면 messagebox 사용된 방법이 다르다. 위에 부분은 잘려있고, 밑에 부분은 함수의 인자가 설정이 되어


있는 것을 확인가능하다. 그래서 위에 messagebox의 인자가 중간에 잘렸다는 소리가 된다.




어셈블리어에서 nop자체는 \x09이라는 1바이트 값이므로 nop이 12번, 12바이트가 stolen 되었다는 것을


의미한다.






패킹된 어셈블리어 코드에서 프로그램이 실행이 되었던 주소인 0040100C의 시작인 PUSH 0이 언패킹된 코드에서 보면


그 어셈블리어 코드부터 시작해서 00407370부터 12byte를 찾으면 이 문제의 stolenByte가 된다.





'보안 > 리버싱' 카테고리의 다른 글

코드엔진 level13  (0) 2017.09.07
코드엔진 level12  (0) 2017.09.06
코드엔진 level11  (0) 2017.09.06
코드엔진 level8  (0) 2017.09.04
코드엔진 level1  (0) 2017.09.04

설정

트랙백

댓글