본문 바로가기

0x00 /0x01 Reversing

- SetWindowsHookEx() API를 이용한 메시지 후킹 # 바로 앞에 포스팅한 Windows 메시지 후킹 실습으로, SetWindowsHookEx() API를 이용하여 메시지 후킹 실습을 해보겠습니다. 본 내용은 리버싱 핵심원리에 나와 있는 내용을 참고하여 했습니다. # SetWindowsHookEx() API를 사용하여 메시지 후킹을 한다고 했는데요. 해당 API 함수를 정리해두었습니다. 참고하실분들은 참고 하세요. [ http://yokang90.tistory.com/48 ] # 해당 실습에 사용된 파일 HookMain.cpp / KeyHook.cpp 2개의 파일입니다. (리버싱핵심원리에서 제공되어진 소스파일입니다)- HookMain.cpp 은 키보드 훅을 설치하는 파일 소스입니다.- KeyHook.cpp 은 키보드 후킹을 실제로 하는 파일 소스입니다. .. 더보기
- Windows 메시지 후킹 # Windows 메시지 후킹 정리. 1. Hook (훅)- 갈고리, 낚시바늘과 같은 뜻을 의미하며, Windows 메시지 후킹에서 의미하는 훅의 의미는 정보를 엿보거나 가로채는 경우를 Hook이라는 말을 사용합니다. # 중간에서 오고가는 정보를 엿보거나 가로채기 위해 초소를 설치하는 일을 훅(Hook)을 건다라고 하고, 실제로 정보를 엿보고 조작하는 행위를 후킹(Hooking)한다 라고 말합니다. 2. 메시지 훅- Windows 운영체제는 사용자에게 GUI(Graphic User Interface)를 제공해주고, 사용자는 제공받은 GUI를 이용하여 하고자하는 행위를 하게 됩니다. 예를 들면, 게임을 한다던가, 음악을 듣는다던가 이러한 행위는 Windows 운영체제에서 Event Driven 방식 처리를.. 더보기
- C 프로그래밍 의사코드 연습 2 # 이번에는 scanf 함수 의사코드 연습- 총 4개 샘플 파일을 가지고 해봤습니다. 1.1 혁재가 짠 코드 실행모습- 정수 입력시 총 5번의 입력을 받는 것을 확인할 수 있었음.- 문자 입력시 총 1번의 입력만을 받았음. 1.2 혁재 파일 디버깅 - 우선 메인함수 내에서 4Byte 크기의 지역변수 3개를 선언한 것을 확인할 수 있었음.- 총 4번의 scanf 함수를 사용하였고, 1~3 번째는 정수를 한번씩 받아서, 각 순서대로 변수에 대입.- 마지막 scanf 함수에서는 3개의 정수를 받아서, 앞에서 받아 저장했던 값들을 모두 덮어씌어버림.- scanf 함수를 호출하는 caller(메인함수)가 전달한 인자를 정리하는 것과 인자가 오른쪽에서 왼쪽 편으로 전달되는 것을 보면 cdecl 호출규약이라는 것 또.. 더보기
- C 프로그래밍 의사코드 연습 1 # Reversing Study- printf 함수 & 함수 호출 규약에 대한 C 코드를 어셈블리어로 디버깅하여 의사코드 작성하기.- Study 내용 : 간단한 C 코드 작성 후 컴파일한 파일을 Study 원들에게 배포. Ollydbg 등으로 디버깅한 내용으로 C 의사코드 작성. 함수호출규약에 대해서 잘 모르시는 분들은 아래 링크 참고하시길.http://yokang90.tistory.com/9 총 5가지 파일을 가지고, 의사코드를 작성.1. RS_1.exe (지훈이)2. re_printf.exe (현민이)3. reversing1.exe (건이)4. reversing2.exe (혁재)5. taeyoul.exe (태열이) 1.1. RS_1.exe 실행 모습- 간단하게 4줄에 걸쳐 printf 함수를 이용하여.. 더보기
- 실행 압축 # 이번에는 실행 압축이라는 내용입니다. # 실행 압축 - 실행 압축은 말 그대로 실행 파일을 압축하는 것을 의미합니다. 실행 파일 압축을 줄여 실행 압축이라고도 부릅니다. 시중에 수많은 실행 파일 압축 프로그램이 존재하며, 이러한 프로그램들은 MS-DOS 시절부터 존재했다고 합니다. 그리고 실행 압축으로 압축된 실행 파일은 일반 압축 파일과는 다르게 압축을 직접 풀어주지 않고, 압축이 된 상태로 실행이 가능합니다. [ 일반 압축과 실행 압축의 비교 - 출처 : 리버싱핵심원리 ] # 실행 압축 목적- 원래 실행 압축은 옛날 DOS OS를 주로 사용하던 시절에 부족한 보조기억장치(HDD,FDD) 공간을 조금이나마 더 확보하기 위한 목적으로 사용되었다고 합니다. 그러나 현재는 하드디스크 및 장치들이 많이 좋.. 더보기
- 데이터 압축 (비손실 압축, 손실 압축) # 이번 포스팅 내용은 데이터 압축에 대해서 알아보겠습니다. # 데이터 압축 - 말 그대로, 데이터를 압축하는거에요. 어떤 형태의 파일이라도 내부는 바이너리 0 혹은 1로 구성되어 있습니다. 이 내부의 바이너리를 적절한 알고리즘을 이용하여 크기를 줄이는 것이 데이터 압축입니다. 데이터 압축에도 2가지 종류가 있는데요. 1. 비손실 압축 (Lossless Data Compression) 2. 손실 압축 (Loss Data Compression) 요렇게 2가지가 있습니다. 첫번째 비손실 압축은 말 그대로 손실이 없다는 것을 의미합니다. 어떤 파일을 압축을 하고(인코딩), 그 파일을 다시복원 시켰을 때(디코딩), 압축전과 100% 일치하는 파일로 복원이 가능하다면 비손실 압축이라고 합니다.흔히들 사용하시는 압.. 더보기
- EAT (Export Address Table / PE File 관련) # 이번 포스팅은 "EAT(Export Address Table)" 입니다. 한동안 공부를 더럽게 안하다가 다시 책을 펼쳐 공부를 시작하기로 했습니다.ㅎ 마지막 포스팅이 PE File의 IAT(Import Address Table) 이였었죠. 라이브러리에서 사용할 함수등에 대한 정보를 기재하고 있는 테이블에 대한 내용이었습니다. 이번에는 라이브러리 파일에서 제공하는 함 수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 EAT에 대해서 알아보도록 하겠습니다. # EAT (Export Address Table) - Export는 라이브러리 자신이 가지고 있는 함수를 다른 PE 파일에게 제공하는 것을 의미합니다. 만약 다른 PE 파일에서 "kernel32.dll"이라는 라이브러리에 존재하는 함수를 사용하.. 더보기
- IAT (Import Address Table / PE File 관련) # 이번 포스팅 내용은 "IAT(Import Address Table)" 입니다. 이전에 "RVA to RAW" 라고, PE 파일이 메모리상에 로딩된 주소인 RVA(프로세스 가상 메모리의 절대주소)를 RAW(File Offset)으로 바꾸는 연습을 했습니다. 이번 포스팅 주제인 IAT 내용을 잘 이해하시기 위해서는 RVA를 RAW로 바꾸는데 어려움이 없으셔야 합니다. PE File Format에서 사용되는 구조체에서는 대부분이 RVA로 주소값들을 명시하기 때문입니다. # IAT (Import Address Table) - 우선 IAT가 무엇인지 알아야겠죠? IAT는 "Import Address Table"의 약어입니다. 영단어 그대로 해석해보면 [ Import : (컴퓨터) (다른 프로그램 에서 데이터를.. 더보기
- RVA to RAW (PE File 관련) # 이번에는 "RVA to RAW"에 대해서 포스팅하도록 하겠습니다. "RVA to RAW"를 간단하게 설명하자면, RVA to RAW 는 PE 파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 File Offset(RAW)을 매핑하는 것을 말합니다. 이전 PE File Format 포스팅에서 언급했던 VA와 RVA에 대해서 간단하게 다시 얘기하고 시작하도록 하겠습니다. RVA ↔ RAW(File Offset) 변환 작업은 PE 헤더를 공부할 때 가장 기본이 되는 개념이므로 잘 숙지하도록 합시다. # RVA to RAW - RVA는 PE 파일이 메모리에 로딩되었을 때의 메모리 주소를 의미하고, RAW는 PE 파일이 로딩되기 전에 File Offset을 의미합니다. - RVA to RAW.. 더보기
- OllyDbg , IDA , GDB를 이용한 간단한 실행 파일 디버깅 # 이번 포스팅에서는 디버깅시에 자주 쓰이는 OllyDbg, IDA Pro, GDB를 이용하여 Window 및 Linux 환경에서 간단한 실행 파일 디버깅해보겠습니다. 리버싱 공부를 시작한지 얼마안되서 틀린 내용이나 부족한 부분이 많을 수 있으니, 그러한 점은 양해부탁드립니다. (틀린 내용이 있을 시 지적해주시면 정말 감사하겠습니다 ^^) 우선 Visual Studio를 이용하여 C 언어로 "Hello World!" 라는 문구를 출력하는 프로그램을 작성했습니다. [ 그림 1 ] "Hello World!" 문구를 출력하는 콘솔 프로그램 작성 1. 첫 번째로 OllyDbg를 이용하여 디버깅해보도록 하겠습니다. [ 그림 2 ] OllyDbg를 이용하여 "Hello World.exe" 파일 불러오기- OllyD.. 더보기
- 함수 호출 규약 (Calling Convention) 더보기
- 아주 간단한 Crack me 샘플 분석 (abex' crackme#2) # 아주 간단한 Crack me 샘플 분석 (abex' crackme#2) 1. 우선 해당 크랙미 파일이 어떤 동작을 하는지 실행시켜 본다.2. 파일을 실행시켜 실마리를 찾고, 디버깅을 할 때 참고한다.3. 크랙미 파일에서 요구하는 부분을 만족 시키기 위한 패치를 하거나 혹은 디버깅을 통하여 필요한 정보를 확인한다. [ 그림 1 ] abex' crackme#2 파일 실행- 파일을 실행시켰더니, Name 그리고 Serial 이란 입력란이 있고, 3가지 버튼이 존재했다. - 이번 크랙미 문제는 시리얼 번호를 알아내야하는 문제인것으로 예상된다. - 임의의 입력값들을 주고 Check 버튼을 눌러보도록 하자. [ 그림 2 ] 임의의 입력값을 주고 Check 버튼을 눌러본 경우- Name의 값은 적어도 4글자 이상.. 더보기
- 아주 간단한 Crack me 샘플 분석 (abex' crackme#1) # abex' crackme #1 분석 1. 우선 abex' crackme #1 파일이 어떤 동작을 하는지 확인하기 위해 실행 시켜본다.2. Crack me 파일에서 수정해야 할 부분들을 패치해준다. (조건에 맞도록) [ 그림 1 ] abex' crackme 파일을 실행 시킨 화면 (왼쪽에서 오른쪽으로 순차) - 파일을 실행 시키니까 "Make me think your HD is a CD-Rom"이란 문자열을 포함한 메시지 박스가 뜨고, 확인 버튼을 누르자, "Nah... This is not a CD-ROM Drive!" 라는 문자열을 포함한 에러 메시지 박스가 떳다. - 이 크랙미 문제는 현재 인식하고 있는 하드 디스크를 CD-ROM 드라이브로 인식하게끔 만들어 달라는 문제로 파악이 된다. - 이제 .. 더보기
- PE File Format # PE File Format - PE(Portable Executable) 파일의 의미를 영단어대로 해석해보면 [Portable=이식가능한, Executable=실행가능한] 대략 이식이 가능한 실행 파일 정도로 해석이 가능합니다. 처음 PE 파일이 만들어질 때는 다른 운영체제에 이식성을 좋게 하려했으나 의도대로 되지 않고, 실제로는 Windows 계열의 운영체제에서만 사용되고 있다고 합니다. 다시 말해, PE File Format은 Windows 운영체제에서만 사용되는 실행 파일의 형식입니다. 이 PE File Format은 기존 UNIX에서 사용되는 COFF(Common Object File Format)를 기반으로 Microsoft 사에서 만들었습니다. PE 파일은 32비트 형태의 실행 파일을 의미.. 더보기
- 간단한 실행 파일 디버깅하기 (문자열패치) # C++로 작성한 간단한 프로그램 디버깅 하기 ① HelloWorld.exe 파일을 디버깅하여, 메시지 박스에 뜨는 문자열을 패치하는 실습. [ 그림 1 ] 메시지 박스를 띄우는 간단한 C++ 코드- C++을 이용하여 간단한 프로그램을 하나 생성한다. [ 그림 2 ] OllyDbg를 이용하여 HelloWorld.exe 파일을 불러온 모습- 문자열을 패치하기 위해서는 문자열이 존재하는 메인 함수를 우선적으로 찾아야한다.- 메인 함수를 좀 더 쉽게 찾기 위해서 메인 함수에서 사용되었던 MessageBox API라던가, 문자열을 참조하면 쉽게 메인 함수를 찾아갈 수 있다. [ 그림 3 ] 문자열 검색 방법으로 메인함수를 찾은 경우- 문자열 검색 방법을 이용하여 C++에서 작성된 문자열을 확인하여 메인 함수를.. 더보기
- OllyDbg 사용법 및 단축키 # OllyDbg 기본적인 사용법 - OllyDbg란 일반적으로 소스코드가 없는 실행 파일을 분석할 때, 디버깅(Debugging)하여 사람이 이해할 수 있는 어셈블리 언어로 변환해주는 디버거 툴이다.- OllyDbg는 무료로 제공되며 가볍고 빨라서 많은 리버서들이 사용하는 디버거 중 하나이다. [ 그림 1 ] OllyDbg 첫 화면 - Code Window : 기본적으로 disassembly code를 표시해주는 창이다.- Register Window : CPU register 값을 실시간으로 표시하며 특정 register들은 이 창에서 수정도 가능하다.- Dump Window : 프로세스에서 원하는 memory 주소 위치를 Hex와 ASCII/유니코드 값으로 표시하고 수정도 가능하다.- Stack W.. 더보기
- 리버싱 기초 # 리버스 코드 엔지니어링 (Reverse Code Enginerring) - 말 그대로 완성된 소프트웨어의 코드를 역으로 분석하는 것이다.- RCE, RE, 리버싱이라고 불리기도 한다.- 소프트웨어를 역공학하는 것, 즉 분석 혹은 상세 분석하는 것이다. ( 이미지 출처 : http://chrispinionlive.com/?p=2276 ) # 리버싱(분석) 방법 - 실행 파일의 분석방법에는 크게 2가지 방법이 있다. ( 정적 분석, 동적 분석 ) 1. 정적 분석 - 파일의 겉 모습을 관찰하여 분석하는 방법이다. - 정적 분석 단계에서는 파일을 실행하지 않는다. - 파일의 종류(EXE, DLL, DOC, ZIP등), 크기, 헤더(PE) 정보, Import/Export API, 내부 문자열, 실행 압축 여부.. 더보기