목록CTF (63)
안 쓰던 블로그
x86에서 x64가 되면서 구조 뿐만 아니라 스택에도 변화가 생겼다 레지스터 사용법 변화 1) 레지스터 이름 및 크기 변화 EAX(4바이트)->RAX(8바이트) EBX(4바이트)->RBX(8바이트) EBP(4바이트)->RBP(8바이트) 앞에 e가 붙으면 x86의 레지스터(32비트), r이 붙으면 x64의 레지스터(64비트)이다 그리고 e~는 4바이트, r~은 8바이트이다 x86에서 x64가 되면서 레지스터 이름과 크기가 변화했기 때문인데, 그렇기 때문에 e~가 사용되지 않는 건 아니다. eax라는 건 rax 레지스터의 하위 4바이트를 의미하는 이름이라고 알면 된다 2) 새로운 레지스터 추가 x86에서는 없던 레지스터 R8, R9 ... R15가 추가되었다 이 중에 R12~15는 비휘발성 레지스터(Non-..
전에 리버싱 공부하면서 레지스터를 정리한 적이 있다 foxtrotin.tistory.com/266 다시 기억할 겸 정리 레지스터는 CPU 내부에 존재하는 작고 고속인 다목적 메모리이다 종류로는 범용, 세그먼트, 상태 플래그, 명령 포인터 등등.. 이 있다 범용 레지스터는 논리, 수리 연산에 사용되는 피연산자, 주소를 계산하는 사용되는 피연산자, 메모리 포인터가 저장된다 세그먼트 레지스터는 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트를 가리키는 주소가 들어 있다 (세그먼트?: foxtrotin.tistory.com/312) 플래그 레지스터는 프로그램의 현재 상태나 조건 등을 검사하는 데 사용되는 플래그들이 들어 있다 명령 포인터(인스트럭션 포인터)는 다음에 수행해야 하는 명령이 있는 메모리 상의 주소가..
스택 영역(스택 프레임) 프로그램 실행 중 만들어지는 지역변수나 매개변수가 쌓이는 메모리 공간 (참고: 메모리 구조 foxtrotin.tistory.com/312 ) 특징 리틀 엔디안 방식으로 저장되므로 하위 바이트부터 먼저 들어간다 스택 기본 구조 Buffer + sfp[4byte] + ret[4byte] 1) 버퍼는 데이터가 저장되는 공간이다 2) sfp는 스택 베이스값을 뜻한다 sfp는 스택 주소값을 계산할 때 현재 스택값의 기준을 잡을 때 필요한 프레임 포인터 값을 저장한다. 크기는 4바이트이다 sfp가 필요한 이유 ebp레지스터는 한 개이기 때문에 함수가 시작할 때마다 ebp값이 바뀌는데 그 전의 ebp값을 스택에다가 저장해야 하기 때문이다 3) ret 은 return의 약자로 반환 주소값을 뜻..
시작 전에 읽으면 좋은 이전 글: 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..