목록CTF/Reversing (26)
안 쓰던 블로그
DLL 인젝션 DLL 인젝션이란 실행 중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입하는 것이다 좀 더 자세하게 말하면 다른 프로세스에게 LoadLibrary() API를 스스로 호출하도록 명령하여 사용자가 원하는 DLL을 로딩하는 것이라고 할 수 있다 DLL 인젝션이 일반적인 DLL 로딩과 다른 점은, 로딩 대상이 되는 프로세스가 나 자신이냐 아니면 다른 프로세스냐 하는 점이다 예를 들어 공격자의 DLL 파일 hack.dll이 있다고 하면, notepad.exe 프로세스의 메모리 공간 어딘가로 강제 삽입을 하여 DLLMain()을 자동호출 시키는 식이다 (참고로 DLLMain()은 프로세스에 DLL이 로딩되면 자동으로 실행된다. 본래는 버그 수정, 기능 추가 등의 목적으로 사용된다. DLL에 대한..
시작 전에 읽으면 좋은 이전 글: VA, RVA, RAW의 개념 foxtrotin.tistory.com/330 DLL(Dynamic Linked Library) 여러 프로세스에서 공유하면서 쓰는 동적 연결 라이브러리 예전 16비트 DOS시절에 DLL개념이 없고 Library만 존재했을 때는 함수 하나(예를 들어 printf)를 실행하고자 하면 라이브러리에서 binary코드를 그대로 가져와서 프로그램에 삽입시켜 버렸다. 즉, 실행 파일에 printf()함수의 바이너리 코드를 가지고 있는 식이었다 그런데 Windows OS로 넘어오면서 멀티태스킹 환경이 지원되었는데, 여러 프로그램들이 동시에 실행되어야 하는 상황에서 각 프로그램마다 기본 라이브러리들과 프로그램을 위한 라이브러리들을 포함시키려니 중복으로 인한..
EAT(Export Address Table)는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할 수 있도록 해주는 핵심 메커니즘이다. ( 라이브러리가 가진 함수를 다른 프로그램에서 사용할 수 있도록 하는 것) IAT처럼 PE 파일 내의 특정 구조체인 IMAGE_EXPORT_DIRECTORY에 정보를 저장한다. 이 구조체는 PE 파일에 하나만 존재한다. 중요 멤버 NumberOfFunctions : 실제 Export 함수의 개수 NumberOfNames : Export 함수 중에서 이름을 가지는 함수 개수 (
EXPORT Table이 비어있는 것을 보니까 notepad.exe는 다른 누군가에게 API를 제공하고 있지 않는다 IMPORT Table을 보면 RVA값과 Size가 있다 이 말은 ImageBase로부터 0x000234B8 만큼 떨어진 곳에 IMPORT Table이 존재한다는 의미이다 ImageBase는 어디에 있는지 확인한다 VA=RVA+ImageAddress니까 0x000234B8 + 0x00400000 되는 곳에 IMPORT Table이 존재할 것이다 근데 디버거로 보면 ImageBase가 다르다 320000이 Image Base, 거기에 text 세션 RVA(1000)을 더한 321000을 잡는다 즉 320000이 실제 Image Base이다 왜 이렇게 차이가 나냐면, 프로그램에 ASLR이 걸려..
UPX 다운로드: upx.github.io/ 최신 버전을 다운로드 받은 뒤 압축을 풀고 system32 폴더의 notepad.exe를 복사해서 같은 작업 폴더에 넣는다 그리고 cmd를 실행한 뒤에 upx -o 명령어로 실행 압축을 진행한다 UPX를 이용한 압축은 결과물이 PE파일이므로 PE헤더와 압축 해제를 위한 코드가 추가된다 참고로 UPX로 압축된 프로그램은 첫번째 섹션은 비어있고 두번째 섹션에 압축된 원본 코드와 압축 해제를 위한 코드가 들어있다. 이 프로그램이 실행되면 먼저 압축 해제를 위한 코드가 실행되어 원복 코드를 압축 해제한 뒤 첫번째 섹션에 저장하게 된다. 패킹된 notepad2.exe에서 OEP(패킹된 파일의 실제 시작 부분)를 찾아 하면 툴없이 패킹을 풀 수 있다 디버거로 notepa..
RVA RVA: ImageBase로부터의 상대주소 (메모리에 로딩된 상태) 특정한 위치로부터 얼마만큼 떨어진 곳에 위치하는지 알려주는 주소 ImageBase는 NT Header중에서 IMAGE_OPTIONAL_HEADER32 구조체 안에 있으며, 메모리에서 PE파일이 어디에 로딩이 되는지 메모리에 로딩되는 시작 주소를 알려준다 PE헤더에서 나오는 거의 모든 주소값은 모두 RVA를 의미한다 VA VA: 프로세스 가상 메모리의 절대주소 (실제 메모리에 로딩되는 주소) 윈도우즈에서 파일을 실행하게 되면 프로세스 어딘가에 존재하는 가상의 메모리 주소공간에 실행한 파일이 올라간다 가상의 메모리이기 때문에 파일이 어디에 로딩 되었는지 시작 주소를 알고 있어야 파일에 접근할 수 있다 실제 주소와 가상 주소를 연결해 ..
pdb> incomplete pdb information (GUID/Signature and/or age) associated with this program Either the program is not a PE, or it was not compiled with debug information windows x86 PE RTTI Analyzer> couldn't find type info 분석 옵션 선택할 때 PDB를 끈다 Windows x86 PE RTTI Analyzer> Couldn't find type info structure. 분석 옵션 선택할 때 Windows x86 PE RTTI Analyzer를 끈다