Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

kaka09

code engn basic 9 본문

Reversing

code engn basic 9

kaka09 2017. 8. 1. 15:39

[사진]1-1


StolenByte?? 를 찾아보라는 문제이다. StolenByte를 처음 들어 봤기에 구글링을 통해 알아보았다. StolenByte란 훔친 바이트를 의미한다. 패킹된 프로그램에서 특정 부분의 코드를 다른 부분으로 옮겨진 코드이다. 주로 엔트리 포인트에서 이용된다. OEP로 점프하기 전에 PUSH 되는것이 특징이라 할 수 있다. 정말로 그런지 올리 디버거를 통해 확인해 보자



[사진]1-2


패킹이 된 프로그램이라 POPAD 부분을 찾았고, 그 밑에 PUSH되는 인자 3개가 존재한다. 특히 2개의 문자열 인자를 살펴보면 무언가 경고창 같은거에 담겨질 메세지처럼 보인다. 그런데 OEP에 진입하지도 않았는데 이러한 인자들이 PUSH가 되었다는 것이 의심이 되는 상황이다. 일단 한번 프로그램을 실행시켜 보도록 하자



 

[사진]1-3


프로그램 실행결과 문자열 인자 2개가 정확히 사용되는것을 확인 할 수 있었다. 결국 OEP 이전에 특정 코드들이 PUSH가 되었고, OEP 이후에 OEP 이전 PUSH된 코드들을 참조하는것으로 보아 StolenByte라고 볼 수 있다. 하지만 좀 더 자세하게 원리를 파악하기 위하여 패킹을 풀고 직접 올리 디버거로 분석해보자



[사진]1-4


실제 OEP 이후에 코드는 [사진]1-4 처럼 확인할 수 있다. 코드 정적분석을 해보면 MessageBoxA 라는 API가 총 4번 사용됨을 알 수 있다. 이는 [사진]1-3 처럼 메세지와 함께 경고창을 띄우는 API인데.. 밑에 3개의 MessageBoxA를 보면 총 4개의 인자를 받아서 실행이 되는것을 알 수가 있는데, 맨 위에 있는 MessageBoxA는 인자가 1개밖에 존재하지 않는다. 즉, OEP 이전에 PUSH된 인자 3개를 빌려와서 실행하는것으로 추론할 수 있다. 이 가설이 맞는지 확인하기 위해 패킹된 프로그램을 한번 실행시켜 보았다.(패킹을 풀어버리면 OEP 이전에 PUSH된 인자들도 소멸하기에 MessageBoxA가 제대로 실행이 안될것이기 때문..)


 



[사진]1-5



패킹 된 프로그램을 실행시켜 봤더니 깨진 문자열들이 나오는것을 확인 할 수 있다. [사진]1-3의 결과와 완전 대비되는 상황.. 즉 글쓴이의 추론대로 OEP 이전에 스택에 삽입된 3개의 인자가 StolenByte라고 할 수 있다.




[사진]1-6


crtl+e 단축키를 통해 직접 소실된 인자의 opcode를 입력하면 [사진]1-6처럼 만들 수 있다. 여기서 한번 프로그램을 실행시켜 보면 정상적으로 글자 깨짐이 없이 실해이 됨을 확인할 수 있다. 즉 이번 문제는 StolenByte에 opcode를 적어주면 된다.



'Reversing' 카테고리의 다른 글

code engn basic 11  (0) 2017.08.01
code engn basic 10  (0) 2017.08.01
code engn basic 8  (0) 2017.08.01
code engn basic 7  (0) 2017.07.31
code engine basic 6  (0) 2017.07.31