Reverse Engineering 썸네일형 리스트형 제2회 IGRUS 해킹 대회 출제자 보고서(9번) 9번 문제 : 송영균 이병의 제대일을 구하세요. 문제풀이------------------------------------------------------------------------------------------------ 9번 문제 : 1. 출제의도 : 이문제를 낸 이유는 리버싱을 할때 분석만이 다가 아니라 적절한 프로그램을 코딩해서 풀수도 있다는(Brute Foces 이용)것을 보여주기 위해 출제했습니다. 이문제는 심플스(Simples) 18번 문제를 표절해서 만들었습니다...... ㅎ 2. 문제풀이 : 프로그램을 실행시키면 와 같이 콘솔창 하나와 메시지 박스 하나가 떠있습니다. 메시지 박스의 확인 버튼을 누르게 되면 날짜가 하나씩 증가합니다. 이문제는 1. 리버싱 수행단계를 거칠필요 없이 바로.. 더보기 제2회 IGRUS 해킹 대회 출제자 보고서(6번) 6번 문제 : dakuo@.exe 를 실행시켜서 답을 구하세요. 문제풀이------------------------------------------------------------------------------------------------ 6번 문제 : 1. 출제의도 : 이문제를 낸 이유는 리버싱을 할때 선행 단계들을 무시한 채 ( 리버싱 수행단계 : http://dakuo.tistory.com/21 ) 무작정 올리디버거에 넣고 보는 사람들에게 경고를 하기 위해서 출제했습니다. (동적분석 없이 바로 정적분석으로 넘어가는) 2. 문제풀이 : 리버싱 수행단계에 의해서 1. 바이너리 분석을 해본다. HexWorkshop과 PEID 로 분석결과 별 특이점을 찾지 못했습니다. 2. 문자열과 API, DLL .. 더보기 올리디버거(OllyDBG)의 Executable Modules 을 통한 문제풀이 올리디버거 창들 중에 Executable Modules 창이 있다. 현재 불러온 프로세스에서 실행중인 모듈들을 보여준다. 한 프로그램에서 여러개의 모듈(ex. DLL 등)을 사용할 경우 올리디버거는 하나의 모듈만을 트레싱할 수 있기 때문에 제대로 분석할수가 없다. 따라서 Executable Modules 창을 이용해 실행 가능한 모듈을 골라서 중요한 코드에 BreakPoint 를 걸어놓음으로써 해당 코드가 실행될 때에 제어권을 올리디버거로 받아 문제를 해결할 수 있다. 일단 해당문제를 실행시켜보자. Ezbeat 문제 패스워드 찾기 올바른 패스워를 찾으시오! 난이도 : ★☆☆☆☆ 위의 메시지 박스가 뜨며 확인을 누르면 콘솔창 하나가 뜨며 Input Password : 를 입력하라고 뜬다. 올리디버거로 프로.. 더보기 안티 디버깅(Anti-Debugging) 안티 디버깅(Anti-Debugging) : 디버깅을 방지하고 분석을 하지 못하도록 하는 기술. 디버깅을 당한다면 해당 디버거 프로그램을 종료시키거나 에러를 발생시키는 방법등 다양한 방법을 사용하여 분석을 방해한다. (참고 : 디버깅(Debugging) : 프로그램의 특정 부분에 Break Point를 설정한 후 실행을 하면 그 위치에 프로그램이 멈추게 되며 메모리에 값이 제대로 들어가 있는지, 코딩한 흐름대로 프로그램이 진행되는지 단계적으로 실행할 수 있다) 안티 디버깅 기술에는 수많은 방법들이 존재하며 계속 발전하고 있으며 이에 따라 이를 우회하는 기술도 계속적으로 발전하고 있다. CheckRemoteDebuggerPresent() Windows API Detecting Breakpoints by C.. 더보기 리빌더를 이용한 CrackMe 16 문제 풀이 리빌더(Rebuilder) : 덤프 툴을 이용하여 메모리상에 존재하는 실행 파일 코드들을 추출하더라도 원래의 실행파일에 정의되어 있는 Import 함수의 정보(IAT : Import Address Table)는 복원되지 않는데 이를 복원해준다. 주로 메뉴얼 언패킹할 때에 사용되며, OEP 주소 부분에서 메모리상에 로드되어있는 프로그램을 파일로 덤프시키고, IAT를 복원하기 위해서 사용한다. 이제 이 리빌더를 이용하여 crackme 16 을 풀어보겠다. 실행시켜보니 단순히 PDA 모양의 창만 뜰뿐 특이한 점은 보이지 않는다. PEID 로 열어봐서 분석을 해보면 UPX 패킹이 되어있다. upx 언패커로 언패킹을 해보니 일반 upx가 아닌 다른 변종의 upx 패킹인것 같다. 그래도 upx 패킹이므로 수동언패킹.. 더보기 아이다(IDA)의 크로스레퍼런스 기능 - 지뢰찾기 맵핵 크로스레퍼런스 : 함수가 사용된 곳을 교차하여 참고할 수 있게 표시를 해주는 것 (참고 : 어떤 함수가 어디에서 또 쓰였는지를 찾기 쉽도록 표시를 해주며 Win32 API에 대해서는 심볼 함수 이름까지도 표현해준다. IDA의 가장 강력한 기능이라고도 할 수 있다) 지뢰찾기(winmine.exe)를 크로스레퍼런스 기능을 이용해 해킹해보도록 하겠다. 'C:\WINDOWS\system32\winmine.exe'를 IDA로 open한다. (참고 : 윈도우 기본 프로그램을 open할 경우 사용할 수 있는 디버거 정보가 담겨있는 심볼 파일을 IDA가 자동으로 연결하여 자세한 정보를 표현해준다. 설정법 : http://dakuo.tistory.com/entry/아이다IDA에-심볼-파일-연결하기) 함수 목록을 살펴본다.. 더보기 아이다(IDA)의 Debugging - IF문 분석 C언어로 if문을 컴파일한 것을 IDA로 분석해보자. #include void main() { int a = 3; int b = 5; if( a > b) { printf(" a 가 크다 "); } else { printf(" b 가 크다 "); } } IDA 그래프 기능으로 본 해당 소스의 흐름이다. 가운데 지점에서 빨간선과 초록선으로 분기하고 각각의 일을 실행한 후 하나로 합쳐지며 프로그램이 종료된다. .text:00411390 push ebp 에 breakpoint를 설정한다. 디버그 모드로 전환(F9)하여 분석을 해보겠다. 다음은 Main함수이다. .text:00411390 main proc near ; CODE XREF: j_mainj .text:00411390 .text:00411390 var_.. 더보기 아이다(IDA)의 Debugging - FOR문 분석 C언어로 for문을 컴파일한 것을 IDA로 분석해보자. #include int main(void) { int i = 0; int result = 0; for ( i ; i 더보기 아이다(IDA)의 Debugging - Stack 분석 IDA의 디버깅을 통한 스택의 Stack 분석 분석해볼 프로그램은 IDA의 사용법을 알아보기 위해 예제로 썻던 것을 계속 쓰겠다. 다시 한번 설명하면 func( ) 함수에 세 개의 값을 파라미터로 전달하고 그 값들의 합을 리턴하는 프로그램이다. #include func(int a, int b, int c) { return a+b+c; } int main(void) { int sum; sum = func(1, 2, 3); return sum; } 프로그램이 실행되기 전의 Stack이다. ESP, EBP의 위치를 살펴본다. .text:00401060 push ebp : EBP가 가리키는 곳이 SFP(Saved Frame Pointer)로 변하고, 그 윗부분이 RET로 바뀌며 스택에 EBP값 12FFC0h값을.. 더보기 리버싱 수행단계 리버싱을 위해서 툴을 사용하는 기본적인 순서이다. 1. 바이너리 분석 2. 문자열 분석 및 Api와 Dll, Event 분석 3. 모니터링을 통한 파일 및 레지스트리, 네트워크 패킷 분석 4. 디스어셈블러나 디버거를 이용한 분석 1. 바이너리 분석, 컴파일러 확인, 패커 여부를 파악한 후에 어떤 언어로 코딩되어 있는지 확인한다. 사용되는 툴 : PEID, HEX Workshop 2. 어떠한 문자열들이 들어있는지 대략적으로 살펴보고, 어떤 Api를 사용했는지, 어떤 Dll을 로딩하는지 주요 이벤트 시점의 위치에 대해서 분석한다. 사용되는 툴 : Dependency Walker, Dumpbin, Strings 3. 모니터링을 해본다. 외부의 시스템과 어떤 패킷이 오가는지도 확인한다. 사용되는 툴 : Proc.. 더보기 올리디버거(OllyDBG)를 이용한 nag 제거와 윈도우 PE 구조 문제 풀이 레나(Lena)라는 제작자가 리버싱 플래시 강좌 40강 중에 3번 강좌에 있는 RegisterMe.exe와 RegisterMe.Oops.exe파일을 풀어보겠다. 강좌 파일을 다운로드 받으면 연습 문제와 강의 파일이 모두 들어 있다. 참고로 관심이 있으신 분들은 1강부터 40강까지 순서대로 모두 보는 것을 추천한다. 자료는 모두 영문이다. 조만간 풀이를 올리도록 하겠다. 문제의 설명을 보면 nag를 제거하고, 헤더 문제를 해결이라고 되있다. nag는 경고창 정도를 의미한다. #03.tutorial 폴더의 files 폴더에 RegisterMe.exe 문제를 올리디버거로 실행해보면 nag 창이 떴다. 확인을 누르면 메인 폼이 뜬다. 종료를 하면 또 nag 창이 뜬다. 처리해야 할 부분은 실행할 때 1번, 종료.. 더보기 올리디버거(OllyDBG)를 이용한 KeyFile 체크 문제 풀이와 바이너리 수정 KeyFile : 인증을 위해서 시리얼키를 원하는 것과 비슷하게 키값을 파일에 저장하거나 어떤 파일 이름이 같은 위치에 있는 것을 확인하는 인증을 할 때 사용되는 파일을 의미한다. 파일과 관련된 문제에서는 파일이나 레지스트리 사용하는 것을 확인하기 위해서 모니터링툴을 사용하는데, Filemon을 주로 사용할 것이다. (Filemon 사용법 참고 : http://dakuo.tistory.com/22) CrackMe 15 문제를 풀어보도록 하겠다. 다운로드 하여 Project1.exe을 실행해보면 올리디버거로 열어서 스트링에 참고할 만한 내용이 있는지 찾아본다. 스트링 추출을 하고 살펴보면 solved라는 문자열을 보인다. 이상한 점은 File Monitor라고 해서 Sysinternals 홈페이지 표시되어.. 더보기 올리디버거(OllyDBG)를 이용한 키젠(Keygen) 문제 풀이 키젠 문제는 프랑스의 haiklr라는 아이디를 쓰는 사람의 홈페이지에서 다운받았다. http://haiklr.new.fr/ 문제를 다운로드 받아서 압축을 풀어보면 ReadMe.txt 파일이 있다. Type : Keygenme Level : Newbie Langage : C (console) Packed : Non 시리얼키들을 생성해내는 문제고, 난이도는 쉬운 편이며, C언어 콘솔어플리케이션이고, 패킹은 하지 않았다고 설명되어 있다. 문제를 실행해보자. Name과 Serial을 입력하라고 나타난다. 입력을 하니까 '잘못된 패스워드'라는 문자열이 출력된다. 올리디버거로 열어서 어떤 알고리즘에 의해서 잘못된 패스워드로 판단했는지 확인해보고 정확한 시리얼값을 찾아보겠다. 문제 파일을 열고, 마우스 우클릭 메뉴에.. 더보기 올리디버거(OllyDBG)를 이용한 CrackMe 문제 풀이 2 이번에 풀어볼 문제는 upx로 패킹이 되있는 문제로 upx -d 옵션으로 압축을 풀어도 되지만 메뉴얼 언패킹하는 방법을 간단하게 설명하기 위해서 올리디버거의 덤프 플러그인을 사용하여문제를 풀어보도록 하겠다. 다음을 다운받아 Plugin 폴더에 넣는다. 올리디버거의 메모리 덤프의 리빌드 기능만으로도 upx 압축은 풀리기 떄문에 쉽게 따라할 수 있는 문제이다. 먼저 PEID로 바이너리를 확인해본다. (PEID 사용법 참고 : http://dakuo.tistory.com/entry/바이너리-분석툴) upx 압축되어 있는 문제 파일인 CrackMe2.exe를 올리디버거로 열어본다. 코드가 압축되었으며, 분석을 더할 것인지 묻는다. 예를 누른 후 아래쪽으로 내려가다 보면 압축이 모두 풀려서 메모리에 올라가 있는 .. 더보기 OllyDbg Command 명령어 사용 커맨드 명령을 사용하려면 특정 상황별로 유용한 api를 알고 있어야 한다. 파일 생성하거나 열기(Open) 16bit : CreateFile 32bit : CreateFileA wide : CreateFileW 파일 입출력(Read&Write) ReadFile : 읽기 WriteFile : 쓰기 파일 접근(Access) SetFilePointer 시스템 디렉터리를 얻어오는 함수 16bit : GetSystemDirectory 32bit : GetSystemDirectoryA wide : GetSystemDirectoryW .ini 파일과 관련된 함수 : ini 구성 설정에 관련된 함수들 16bit : GetPrivateProfileString, GetPrivateProfileInt, WritePrivat.. 더보기 리버싱을 위한 기초 지식 - 진수변환과 CPU 레지스터 1. 진수 변환 : 2진수, 10진수 16진수의 뜻과 자유롭게 변환하는 법을 소개한다. 10진수를 기준으로 해서 2진수와 16진수를 설명하겠다. 2진수는 0과 1로만 이루어져 있어서 1 다음이 한 자리 올림을 한 10이 된다. 2진수가 영어로 binary이기 때문에 뒤에 b를 붙인다. 16진수는 1부터 9, 그리고 A부터 F까지 순차적으로 사용하고, 10진수로 16이 되면 그때 자릿수를 올려 10이 된다. 16진수를 표현할 때는 영어로 hexadecimal이기 떄문에 뒤에 h를 붙인다. 그리고 구분을 더 편하게 하기위해서 앞부분에는 0을 붙인다. 10진수 2진수 16진수 10진수 2진수 16진수 1 1 1 10 1010 A 2 10 2 11 1011 B 3 11 3 12 1100 C 4 100 4 13 .. 더보기 올리디버거(OllyDBG)를 이용한 CrackMe 문제 풀이 crackme author : abex type : cdrom check level : easy tute author : HaQue Ollydbg.exe 실행해서 abexcm1.exe를 open한다. 프로그램이 어떻게 작동되는지 보기 위해 Run(F9)을 한다. 첫 번째 메시지박스가 나타나고, 확인을 클릭하면 두 번째 메시지박스가 나타난다. 확인을 클릭하고 올리디버거를 보면 프로그램이 종료되었음을 알 수 있다. 첫번째 메시지박스에는 CD-ROM을 체크하는 루틴을 우회하라고 나오고 두번째 메시지박스에는 CD-ROM이 아니라고 하며 프로그램이 종료되었다. 이 문제를 푸는 방법에는 메모리 주소 흐름을 바꾸는 방법과, CD-ROM을 체크하는 함수의 리턴값을 변경해서 푸는 방법 2가지 방법이 있다. 1번 방법 풀.. 더보기 Reverse Engineering 이란. Reverse Engineering이란 역으로 분석하는 것이라고 정의할 수 있다. (줄여서 Reversing) 즉, 개발자가 소스 코드를 작성하고 그것을 실행 가능한 바이너리를 만들기 위해 원하는 컴파일러를 선택하여 컴파일시킨다. 이 바이너리의 원래 소스를 파악하기 위해 여러가지 방법을 통해 원래 소스의 구조와 원리를 분석하는데 이러한 과정이 리버싱(Reversing)이다. 또 리버싱은 완성된 프로그램의 수정, 디버깅, 호환과 프로그램의 분석 등 다양하게 쓰이고 있다. 더보기 이전 1 다음