본문 바로가기

리버싱

(19)
취약점 리버싱 요약 노트 1. 리눅스로 파일을 받으면? 1) file 명령어를 통해 파일 정보를 확인한다. - 시그니처를 파싱해서 보여줌. (파일정보, 아키텍처 정보등등) 2) strings 명령어를 통해 파일의 정보를 확인한다. - 라이브러리 함수 같은 정보들도 알 수 있음 2. 대부분의 함수는 libc라이브러리 안에 포함되어있다. - 카피 strcpy, strncpy, memcpy - 비교 strcmp, strncmp, memcmp - 길이 strlen - 메모리 : malloc, free - 기타 : sleep.. 3. IDA에서는 배열, 포인터, 심볼, 라이브러리에 대한 정보는 내가 바꿔줘야 한다. 4. IDA에서 FLIRT를 사용하라. 특정 함수에 대해 알아서 시그니처를 만들어준다 (MS, libc) 5. C++과 별차..
DLL(Dynamic-link library) 동적 분석 방법 1) DLL 파일 내에 있는 함수 호출 방법 DLL 내부에는 다른 프로그램들이 호출할 수 있는 다양한 함수들이 존재한다. 이 함수는 묵시적 링킹(Implicit linking)과 명시적 링킹(Explicit linking)으로 사용이 가능하다. 묵시적 링킹은 실행 파일 내에 사용하고자 하는 DLL의 이름과 함수를 포함시킨 뒤 프로그램 실행 시 해당 함수를 초기화하고 이용하는 방법이다. 이는 컴파일 시 헤더파일(*.h)과 라이브러리 파일(*.lib) 파일이 필요하다. 단점으로는 DLL 파일이 존재하더라도 헤더파일과 라이브러리 파일이 배포되지 않는다면 분석이 불가능하다. 명시적 링킹은 프로그램 실행 도중 LoadLibrary와 GetProcAddress API를 이용해 동적으로 함수를 불러와 사용하는 방법이..
리버싱 예제 2 (정적분석 vs 동적분석) 1. 파일을 다운받고 압축을 푼다. 파일 : 2. 실행 후 문제가 무엇인지 확인 F1계속 출력 -> F2 계속 출력 -> F3계속 출력하다가 에러! 일단 IDA를 통해 문제가 무엇인지 확인하자. 3. IDA를 사용해 문제 확인 일단 Graph View를 사용해 코드의 진행을 눈으로 확인하자. 일단 어디서 에러가 나는지 모르니 실행을 시켜보자. 메뉴 -> 디버거 -> 스타트 프로세스(F9) 에러창과 함께 다음과 같은 화면을 볼 수 있다. 문제가 무엇인지는 알 수 없으나 몇가지 힌트를 얻을 수 있다. sub_401020+A 에서 main:loc_401050으로 분기를 하고 잘못된 메모리 영역은 0xA3166을 참조해서 에러가 났다는 것을 알 수 있다. 그렇다면 F3이라는 텍스트를 어디서 참조했는지 알아보자...
PE파일 데이터 암호화 실행파일을 메모리에 올려주는 작업을 PE로더라한다. 검증작업을 걸쳐서 실행파일이 맞으면 메모리에 올려준다. 예를들어 MZ라는 단어가 있어야만 실행이 된다. 실행파일을 보면 보통 최소 4키로바이트이다. 우리는 이런 이유가 클러스터 크기가 4KB이기 때문에 그렇다고 생각하지만 실행파일은 실제 4KB에 가깝다. 왜냐하면 실행에 관련된 필요한 정보 같은 것이 담겨있기 때문이다. 그래서 한 때 실행파일을 최소로 줄이는 대회가 있었다. 그 때 97B로 그 크기를 줄일 수 있었다고 한다. PE파일이 메모리에 로딩되면 거의 그대로 올라간다. 하지만 바뀌는 것이 존재한다. 파일의 오프셋-> 메모리에 올라오는 주소가 바뀌게 되는데 실행파일의 이러한 alignment는 대게 0x1000이다. 악성행위자는 이런 남는 공간을 ..
PE파일 구조 PE파일 분석 도구 : 실행파일(Executable File)이란 명령(Operation Codes)에 따라 지시된 작업을 수행하도록 하는 파일을 말한다. 이 파일은 실행 코드, 전역 데이터, Import/Export 함수정보, 리소스 데이터 등으로 구성된다. 포맷 종류는 PE(Windows), ELF(Linux, Unix), Mach-O(OS X,iOS), DEX(Android), MZ(Dos)등이 있다. 이때 PE(Portable Executable)파일은 Windows 3.1부터 지원되는 실행파일 형식이다. 이는 유닉스의 COFF(Common Object File Format)를 기반으로 하고 파일 종류는 실행파일(EXE, SCR), 라이브러리(DLL, OCX), 드라이버(SYS), 오브젝트파일(O..
리버싱 예제 1 (라이센스 우회) 1. 파일다운 받고 실행 위의 폴더에서 2번째 예제를 풀어본다. 실행파일은 다음과 같다. 우선 실행을 시키면 다음 그림과 같은 메시지박스가 뜬다. 2. ollydbg.exe 실행 평가 기간이 만료되었으니 새 라이센스를 구입하란다. 우선 어셈코드를 확인하기 위해 ollydbg.exe를 실행한다. 위의 화면은 다음과 같이 구성되어 있다. - 왼쪽 상단 : 어셈코드 - 오른쪽 상단 : 레지스터 정보 - 왼쪽 하단 : 메모리 정보 - 오른쪽 하단 : 스택 정보 3. 문제 확인 1 코드를 천천히 내려서 문제가 발생했던 지점을 찾고 브레이크 포인트(F2)를 건다. 그리고 디버깅을 실행(F9)한다. 00401078 CMP EAX, -1 EAX 값과 -1을 비교한다. 0040107B JNE SHORT 0040109A ..
리버싱 백그라운드(x86) 1. Fetch 사이클과 Execution 사이클 우리가 프로그램의 일부분을 수정하고 싶을 때 프로그램의 소스코드가 있다면 소스코드를 통해 프로그램의 실행구조를 확인하고 다시 컴파일 하면 된다. 하지만 소스 코드가 없다면 디버깅을 통해 어셈블 코드가 어떻게 실행되는 알아야만 한다. CPU의 60퍼센트는 ALU로 이루어져 있고 나머지는 주변장치로 이루어져 있고 시분할을 이용해 아주 작은 시간 안에는 반드시 하나의 코드만 실행된다 이 실행될 명령은 인스트럭션 큐에 들어가 있다. 온리디버그와 같은 프로그램을 사용할 때 브레이크 포인트를 거는 것은 소프트웨어 인터럽트를 이용하는 것이다. (INT3 : HALT : 0xCC) 그리고 내부 레지스터의 값을 확인하는데 적절한 인터럽트의 위치와 시점은 연습을 통해 깨닫..
해커스쿨 FTZ Level11 (버퍼오버플로우 : 기초) + GDB 설명 ID : level11Password : what!@#$? 힌트 : #include #include int main( int argc, char *argv[] ){ char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str );} 문제를 풀기 전에 : gdb 사용법 1. 실행 gdb 프로그램(또는 프로세스번호) -q 또는 -silent 또는 -quiet : 실행 시 쓰레기 설명글 제거 2. 종료 quit (또는 q) 컨트롤 + D 3. 폭조절 set width 값 set height 값 4. 디버깅 중간에 쉘 명령어 사용하기 shell 명령어 (경로는 프로그램 위치와 같음) 5. 팁 탭 : 자동 명령 생성 (중복 항목이 있을 경우..