본문 바로가기

분류 전체보기

(64)
2024.8.14 리버싱 공부(나뭇잎 책) DLL ejection 다른 프로세스의 DLL을 Free하도록 만드는 것 CreateRemoteThread를 이용해 FreeLibrary API를 호출하게 하고 그 인자로 Free할 DLL의 주소를 넘겨주면된다. // EjectDll.exe #include "windows.h" #include "tlhelp32.h" #include "tchar.h" #define DEF_PROC_NAME (L"notepad.exe") #define DEF_DLL_NAME (L"Dll1.dll") DWORD FindProcessID(LPCTSTR szProcessName) {     DWORD dwPID = 0xFFFFFFFF;     HANDLE hSnapShot = INVALID_HANDLE_VALUE;     PRO..
유니코드, ANSI 설명 이 글을 쓰게 된 이유는 LoadLibraryW와 LoadLibraryA의 차이점을 찾아보다 알게되어서 LoadLibraryW는 입력을 유니코드 인코딩으로 받고 LoadLibraryA는 입력을 ANSI 인코딩으로 받는다  유니코드는   UTF-8: 가변 길이 인코딩 방식으로, 문자에 따라 1바이트에서 4바이트까지 사용한다. 영어와 같은 라틴 문자에 대해서는 1바이트를 사용하고, 복잡한 문자에 대해서는 더 많은 바이트를 사용한다. UTF-16: 문자에 따라 2바이트 또는 4바이트를 사용한다. 유니코드 문자의 대다수는 2바이트로 표현된다. UTF-32: 모든 문자를 4바이트로 고정 길이로 인코딩한다. 이 방식은 간단하지만 메모리 사용량이 크다. ANSI는  1바이트 인코딩: 기본 ASCII 문자는 7비트로 ..
2024.8.13 리버싱 공부(나뭇잎 책) DLL Injection 훅(Hook)갈고리, 낚시바늘, 원하는 것을 낚아 챌때 사용하는 도구정보를 엿보거나 가로채는 경우 Message Hook OS - App - User 사이에 오고가는 정보를 엿보고 조작할 수 있음.Windows 는 event driven으로 동작하는데Event가 발생하면 OS message queue에 추가된다.OS는 OS message queue에서 message를 꺼내서 어느 프로세스에서 발생했는지 보고 해당 프로세스의 Application Message Queue에 추가한다.프로세스는 본인의 Application Message Queue를 모니터링 하다가 추가된 message가 있으면 해당 event handler를 호출해서 처리한다. message Hook이 설치되어 있다..
PE패치 dll 로딩 의문점 PE 패치 시에 IDT를 섹션의 빈 부분으로 옮겨서 늘렸는데 계산 방법이 virtual size와 size of raw data의 차이에서 virtual size에 매핑되지 않는 부분에 IDT를 옮겼다. 내가 이해한 바로는 file의 섹션에서 virtual size만큼만 읽어서 메모리에 올릴것이라고 생각했다. 이 점이 궁금해서 디버거와 PE viewer, HXD를 이용해서 실험해봤다. virtual size가 188E 이고 Size of Raw Data가 1A00인 파일을 가지고 매핑되지 않은 부분은 0으로 채워져 있었는데 Hxd로 0이 아닌 다른 값들로 채워보았다. x64dbg로 디버깅 해보니 내가 채운 값들이 들어 있고 section alignment가 1000이었는데 size of raw data보..
2024.8.12 리버싱 공부(나뭇잎 책) UPack-PE 패커 PEViewer로는 PE볼 수 없음 UPack으로 패킹하면 PE포멧을 신기하게 바꿔서. Stud_PE로 볼 수 있는데 UPack이 주는 지식 1.PE 헤더 관련 1.1 헤더 겹쳐쓰기Dos header(MZ헤더)와  NT header을 겹쳐씀. 헤더 공간 절약 및 복잡성 증가MZ 헤더의 핵심 멤버는magic number - MZe_lfanew - File address of new exe header(NT header 시작 위치)보통의 경우 e_lfanew = mz크기(40)+Dos stub 크기UPack에서는 10으로 MZ헤더와 NT 헤더가 겹쳐서 써짐1.2 File header.SizeOfOptionalHeader 값 변경File header.SizeOfOptionalHeader ..
gdb 명령어 disas main r  -run c - continue b function - function에 break pointb *address - address에 break point disas function_name - 함수 디스어셈블해줌 ni -step over si      -step in info f - 스텍 프레임 내용bt - 전체 스텍 프레임 info argsinfo registers - 레지스터출력info reg레지스터 보고 rip 값 보고 현재 위치 보고 disas나 x/10i로 코드 보기 x/16x address - address부터 16개 메모리 보기x/16i address - address부터 16개 명령어로 보기x/16g address - 64bit로 보기  x/24g 0x403e080..
섹션 스택 힙 PE파일이 메모리에 올라오면 PE헤더 및 섹션이 올라오고 EP(entry Point)에서 push, pop 등으로 스택을 관리하고 malloc같은 걸로 힙을 사용한다.
dll 관련 의문 DLL이 사용되는 이유가 여러 프로세스에서 DLL을 한번만 올리고, 프로세스가 공유해서 사용하면서 메모리 낭비를 줄이는 것인데,A,B라는 2개의 프로세스가 동일한 DLL을 사용하고 있고 디버거로 A 프로세스에 붙어서 코드나 데이터를 수정하면 B 프로세스에도 동일한 DLL이기 때문에 수정한 DLL이 적용 될까? 실험을 해봤다. 내가 DLL을 만들어서 processExplore로 지켜보며 실험해본 결과, 일단 DLL이 한번만 올라가지 않는다. DLL을 주입할때 프로세스의 메모리가 증가했다. 그리고 한 프로세스에 디버거를 붙여서 DLL을 수정하면 다른 프로세스의 DLL이 변화하지 않는다.  구글에 찾다보니https://blog.naver.com/ontow/140131030101 윈도우 시스템 DLL 을 메모리..