목록리버싱 (12)
ii4gsp

#include "windows.h" #include "tchar.h" int _tmain(int argc, TCHAR *argv[]) { MessageBox(NULL, L"Hello World!", L"Reverse", MB_OK); return 0; } 실행파일의 소스코드이다. 먼저 정적분석을 해보면, 프로그램 실행시 "Hello World!" 라는 문자열이 출력되고 프로그램이 종료된다. 목표는 "Hello World!" 라는 문자열을 "Hello Reversing" 으로 바꿔보겠다. 디버거를 열어서 마우스 우클릭 -> Search for -> All referenced text strings 를 클릭해주자. 더블클릭을 하여 "Hello World!" 문자열이 있는 곳으로 이동해주자. 이동을 해보면 ..

#include "windows.h" #include "tchar.h" int _tmain(int argc, TCHAR *argv[]) { MessageBox(NULL, L"Hello World!", L"Reverse", MB_OK); return 0; } HelloWorld.exe 프로그램의 소스코드는 이러하다. 프로그램을 디버깅 하기전에 정적분석을 통해 프로그램을 분석해보자. 프로그램 실행시 Hello World! 라는 메세지를 출력해주는 메세지 박스가 뜨고 확인을 누르면 프로그램이 종료가 된다. 아주 간단한 프로그램이니 정적분석은 이정도로 충분하다. 바로 동적분석을 해보자. Immunity Debugger로 프로그램을 열어보면 4가지의 기본 화면이 나온다. Code : 기본적으로 disassembl..

OEP를 구하라고한다. OEP는 프로그램이 구동되는 첫 시작점을 말한다. 파일이 upx패킹이 되어있다. 파일을 언패킹해주었다. 올리디버거로 파일을 열어주면 OEP가 바로 보인다. OEP는 01012475이다.

C드라이브의 이름이 CodeEngn 일경우 CodeEngn이 어떤것으로 변경되는지라고 물어본다. C드라이브의 이름을 CodeEngn으로 바꿔주자. 프로그램을 실행했을때의 모습이다. 아무 값이나 넣어주고 Check를 눌러보자. 에러 메세지가 뜬다. 올리디버거로 파일을 열어보면 시리얼값이 일치할때와 일치하지않을때의 문자열이 보인다. CMP EAX, 0부분에 break point를 걸어주고 프로그램을 실행해보자. 입력한 "1234"와 시리얼처럼 보이는 "L2C-5781EqfgEngn4562-ABEX"가 보인다. "EqfgEngn"이 "CodeEngn"과 유사한 점에서 "CodeEngn"이 EqfgEngn"으로 바뀐걸 알 수 있다. 프로그램을 다시 실행하여 "L2C-5781EqfgEngn4562-ABEX"를 입..

언팩하고 시리얼을 찾으라고한다. 정답은 OEP + Serial이다. 파일을 실행시켜보자. 파일을 실행시키고 아무 값이나 넣어주자 Check Serial을 누르면 에러가 뜬다. 파일을 언패킹을 해주자. 올리디버거로 파일을 열어주자 OEP는 00401360이다. 우클릭 -> Search for -> All referenced text strings를 눌려주자. 아까 보았던 에러 메세지가 있다. 더블클릭으로 이동해주자. "AD46DFS547"이라는 문자열이 push되고 밑에 성공했을때 나오는 문자가 있는걸로 봐서 "AD46DFS547"이 시리얼이라고 생각하였다. 시리얼값을 "AD46DFS547"을 넣어주고 Check Serial을 눌러주자. 시리얼은 "AD46DFS547"이다. 맨처음에 구한 OEP와 시리얼을..

프로그램의 등록키를 물어본다. 프로그램을 다운받고 실행해보자. 이름과 시리얼값이 일치해야 한다. 일치하지않으면 에러가 뜬다. UPX 패킹이 되어있다. upx 패커로 언패킹해주자. 올리디버거로 파일을 열고 Search for -> All referenced text strings를 클릭해주자 아까 보았던 에러 문자가 있다. 코드가 실행되는 부분으로 이동해주기 위해 더블클릭을 해주자. Registered User를 EDX에 저장하고 난다음 호출하는 함수에 break point를 걸고 파일을 실행해주자 키 값은 1111이라는 아무 값이나 주자 F7로 함수내부에 들어와보면 EAX와 EDX가 값을 비교한다. EAX, EDX레지스터의 값을 확인해보자 EAX에는 우리가 입력한 "Unregistered..."이 있고 ..

디버거 프로그램을 탐지하는 함수를 찾아보자 프로그램을 실행하면 "정상"이라는 문자가 출력된다. 올리디버거로 프로그램을 열어 실행하면 "디버깅 당함"이라는 문자가 출력된다. Search for -> All intermodular calls를 클릭하고 IsDebuggerPresent라는 함수가 보인다. 함수이름부터 IsDebuggerPresent이기 때문에 디버거를 탐지한다고 의심하였다. 더블클릭을 하여 IsDebuggerPresnt함수가 실행되는 영역으로 이동해주었다. IsDebuggerPresent함수를 호출하는 부분에서 break를 걸고 실행하면 아무런 문자도 출력이 안된다. EAX레지스터의 값을 확인해보니 0이다. IsDebuggerPresent함수를 호출하고 난 다음의 명령인 CMP ESI, ESP..

문제를 보니 스트링 비교함수를 찾아내는것 같다. 프로그램을 실행하여 Regcode부분에 임의의 값을 넣어보자 에러 문자가 뜨는것을 볼수있다. 올리디버거로 파일을 열고 문자열 비교함수 찾아보자. 우클릭을 눌러 Search for -> All intermodular calls를 눌러주면 해당 프로그램에서 쓰고있는 함수들을 볼수있다. StrCmp이라는 문자열 비교함수를 찾을수있다. 더블클릭을 하면 StrCmp함수가 사용되고있는 부분으로 이동한다. "2G83G35Hs2"를 push하고 StrCmp함수를 호출하여 문자열을 비교한다. "2G83G35Hs2"를 패스워드에 입력해보자. 해석) 감사합니다, 비밀번호가 맞습니다 성공