Hacker Dakuo154 올리디버거(OllyDBG)를 이용한 키젠(Keygen) 문제 풀이 키젠 문제는 프랑스의 haiklr라는 아이디를 쓰는 사람의 홈페이지에서 다운받았다. http://haiklr.new.fr/ 문제를 다운로드 받아서 압축을 풀어보면 ReadMe.txt 파일이 있다. Type : Keygenme Level : Newbie Langage : C (console) Packed : Non 시리얼키들을 생성해내는 문제고, 난이도는 쉬운 편이며, C언어 콘솔어플리케이션이고, 패킹은 하지 않았다고 설명되어 있다. 문제를 실행해보자. Name과 Serial을 입력하라고 나타난다. 입력을 하니까 '잘못된 패스워드'라는 문자열이 출력된다. 올리디버거로 열어서 어떤 알고리즘에 의해서 잘못된 패스워드로 판단했는지 확인해보고 정확한 시리얼값을 찾아보겠다. 문제 파일을 열고, 마우스 우클릭 메뉴에.. 2009. 10. 27. 스택과 콜링컨벤션의 이해 Function(1, 2)라고 선언이 된 함수가 사용된다면 push 2 push 1 call 004017E0 이와 같은 어셈블리 코드가 되는데, 파라미터는 뒤에서부터 push가 된다. 그 이유는 스택(stack)에 값을 순서대로 쌓아놓고, 나중에 쌓인 값을 우선으로 해 빼서 사용하기 때문이다. 일반적인 메모리 구조는 그림과 같다. 프로그램이 실행되기 위해서는 실행에 필요한 모든 것들이 메모리에 적재되어야만 한다. Text : 컴파일된 프로그램 소스가 기계어의 형태로 위치 Data : 프로그램에서 초기화된 데이터들의 위치 BSS : 초기화되지 않은 변수들의 위치. 항상 0으로 초기화됨 Stack : 지역변수, Command Line arguments 위치 Heap : 동적으로 할당된 변수들이 위치 Stac.. 2009. 10. 26. 올리디버거(OllyDBG)를 이용한 CrackMe 문제 풀이 2 이번에 풀어볼 문제는 upx로 패킹이 되있는 문제로 upx -d 옵션으로 압축을 풀어도 되지만 메뉴얼 언패킹하는 방법을 간단하게 설명하기 위해서 올리디버거의 덤프 플러그인을 사용하여문제를 풀어보도록 하겠다. 다음을 다운받아 Plugin 폴더에 넣는다. 올리디버거의 메모리 덤프의 리빌드 기능만으로도 upx 압축은 풀리기 떄문에 쉽게 따라할 수 있는 문제이다. 먼저 PEID로 바이너리를 확인해본다. (PEID 사용법 참고 : http://dakuo.tistory.com/entry/바이너리-분석툴) upx 압축되어 있는 문제 파일인 CrackMe2.exe를 올리디버거로 열어본다. 코드가 압축되었으며, 분석을 더할 것인지 묻는다. 예를 누른 후 아래쪽으로 내려가다 보면 압축이 모두 풀려서 메모리에 올라가 있는 .. 2009. 10. 26. 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.. 2009. 10. 26. 리버싱을 위한 기초 지식 - 진수변환과 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 .. 2009. 10. 26. 상황별 기초 어셈블리어 어셈블리 명령어를 상황별로 어떻게 사용되는지 정리해보며 공부해보자. 1. 데이터 이동 : 어셈블리에서 데이터를 옮기고자 할때는 MOV 명령어를 사용한다. MOV [복사될 곳], [읽어들일 곳] MOV EAX, EBX의 경우 EBX 레지스터를 EAX에 대입한다. MOV EAX, [EBX]로 표현되어 있는 경우에는 EBX가 가리키는 값을 EAX에 대입한다. MOV EAX, [EBP+10]의 경우 EBP의 주소에서 20만큼 증가한 주소지의 값을 EAX에 대입한다 MOV EAX, [EBP-10]의 경우 EBP의 주소에서 20만큼 감소한 주소지의 값을 EAX에 대입한다 [EBP+10]과 [EBP-10]의 경우에 함수 내부에 존재하는 명령이었다면 EBP를 기준으로 10 증가된 경우에는 파라미터로 넘어오는 값일 수 .. 2009. 10. 26. 이전 1 ··· 22 23 24 25 26 다음