본문 바로가기

해커스쿨 LOB ( gremlin -> cobolt ) by ORANG ​LOB_gremlin [gremlin@localhost gremlin]$ bash2[gremlin@localhost gremlin]$ cat cobolt.c/* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer*/ int main(int argc, char *argv[]){ char buffer[16]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer);} bash2 띄워주고~ 소스를 보겠습니다!! 힌트는 small buffer 군요buffer의 사이즈가 16밖에 안되네요ㅠㅠ음.. 환경변수를 이용한 방법.. 더보기
해커스쿨 LOB ( gate -> gremlin ) by ORANG LOB_gate 이번엔 LOB 문제풀이를 하겠습니다ㅎㅎ해커스쿨 FTZ보다 난이도 있는 BOF 문제들로 이루어진 것 같네요열심히 풀어봅시다!! [gate@localhost gate]$ bash2[gate@localhost gate]$ cat gremlin.c/* The Lord of the BOF : The Fellowship of the BOF - gremlin - simple BOF*/ int main(int argc, char *argv[]){ char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer);}[gate@localhost gate]$ ls -l .. 더보기
어셈블리어 코딩연습 01.. MacOSX 어셈블리어 코딩 연습 01 어셈블리어로 가장 간단한 "Hello Word!!"를 만들어보겠습니다~~ SeoSeoung-oh@MacBook-Air$cat hello.c#include int main(void){ printf("Hello It's C\n"); return 0;}SeoSeoung-oh@MacBook-Air$gcc -c hello.c -o hello.oSeoSeoung-oh@MacBook-Air$objdump -d hello.o -Mintel hello.o: file format mach-o-x86-64 Disassembly of section .text: 0000000000000000 : 0: 55 push rbp 1: 48 89 e5 mov rbp,rsp 4: 48 83 ec 10 sub r.. 더보기
리눅스 프로세스 메모리 구조 env, etc & argc, argv 도 스택의 일부분 더보기
x86_64(64비트) 모드, 주소 변환 과정 64비트 모드 주소 변환 과정 64비트 모드 세그먼테이션 과정은 32비트 모드와 동일하게 진행되는데, 차이점으로 주소 공간이 확장되어 세그먼트 디스크립터에 설정된 기준 주소와 크기에 관계없이 모든 세그먼트가 기준 주소는 0, 크기는 64비트 전체로 설정됩니다. 선형 주소의 주소 영역 자체가 0부터 64비트 전체가 되는 것이죠 페이징 기법을 통한 주소 변환 5단계 페이징 기법을 예로 보겠습니다. 글자가 길어서 헷갈리므로 그냥 편의상페이지 맵 레벨 4 = PML4페이지 디렉토리 포인터 = PDP페이지 디렉토리 = PD페이지 테이블 = PT라 하면 CR3 레지스터가 PML4 테이블의 기준 주소를 가리킵니다.PML4 테이블 기준 주소 + 선형 주소의 PML4 오프셋 = PML4 엔트리PML4 엔트리가 PDP 테.. 더보기
x86(32비트) 모드, 주소 변환 과정 32비트 모드에서의 가상 주소 -> 선형 주소 -> 물리 주소 변환 과정 가상 주소를 선형 주소로 변환하는 과정(세그먼테이션) GDTR 레지스터 -> GDT의 크기 필드와 기준 주소 필드로 구성 -> GDT의 기준 주소조세그먼트 셀렉터의 구조 index는 GDT 또는 LDT 상에서의 위치를 나타내고,TI 비트는 GDT인지 LDT인지를 구분합니다. GDTR로부터 GDT의 기준 주소와 세그먼트 셀렉터의 index를 통해 -> 세그먼트 디스크립터에 접근합니다.세그먼트 디스크립터에는 세그먼트 기준 주소와 기타 정보가 포함되어있는데세그먼트 기준 주소 + 논리주소값(오프셋) = 선형주소 가 됩니다. 선형 주소를 물리 주소로 변환하는 과정(페이징) CR3 레지스터가 페이지 디렉터리 테이블의 기준 주소를 가리킨다.페이.. 더보기
64비트 주소를 상위 32/하위 32비트로 나누어 표현 64비트 주소를 상위 32비트/하위 32비트로 나누어 표현하는 방법 코드로 볼 때는 헷갈렷는데.. 정리하고나니 너무 간단하네요 메모리를 읽을때 2진수로 읽는 건 알아보기 힘들고 비효율적이므로 2진수 숫자 4개를 묶어 16진수로 표현한 후, 16진수로 읽습니다. 1바이트는 8비트이므로, 1바이트당 16진수 2개로 표현할 수 있겠네요 64비트는 8바이트가 됩니다. 1바이트씩 나누어 표현해서 그림과 함께 보겠습니다.상위 32비트 / 하위 32비트는 각각 4바이트가 되겠네요 음.. 1바이트는 8비트이고 4비트씩 16진수 한개로 묶어 16진수 2개로 표현한다고 했습니다.그럼 바이트 단위로 보았을때, 256 = 16^2 = 2^8만큼 차이가 나겠죠?간단한 것이지만 예를 들어보자면.. 0x01과 0x0100 처럼 말.. 더보기
PE 파일 포맷 ( PE File Format ) 요약 PE File Format PE(Portable Executable)파일 - Windows 운영체제에서 사용되는 실행 파일 형식 종류 - 실행 계열 : exe, scr - 라이브러리 계열 : dll, ocx, cpl, drv - 드라이버 계열 : sys, vxd - 오브젝트 파일 계열 : obj 구조 PE Header : DOS Header ~ Section Header PE Body : PE헤더 이후 Section들 파일을 실행하기 위한 모든 정보는 구조체 형식으로 PE 헤더에 저장되어 있다.섹션 헤더에 각 섹션에 대한 크기/위치/속성이 정의되어 있고,파일의 내용은 코드(.text), 데이터(.data), 리소스(.rsrc) 섹션에 나누어 저장한다. 파일에서는 offset으로 메모리에서는 VA로 위치 .. 더보기
함수 호출 규약(Calling Convention) 함수 호출 규약(Calling Convention) 함수 호출 시 전달 되었던 파라미터들에 대하여함수 호출이 끝난 후 스택을 정리하는 방법에 대한 약속( ESP를 정리하는 방법 ) caller : 함수를 호출한 쪽callee : 호출 당한 함수 1. cdcel- 주로 C언어에서 사용 됨- caller에서 스택을 정리한다.- 장점 : 가변 길이 파라미터를 전달할 수 있다.2. stdcall- Win32 API에서 사용됨- callee에서 스택을 정리- c언어에서 stdcall 방식을 사용하고 싶을 때는 함수이름 앞에 '_stdcall' 옵션 추가3. fastcall- stdcall 방식과 기본적으로 같지만, 전달하는 파라미터의 일부(2개)를 레지스터(ECX, EDX)를 이용해 전달한다. 나머지는 스택을 통.. 더보기
레지스터 ( Register )의 이해 IA-32(Intel Architecture 32bit)의 레지스터에 대해 정리하겠습니다. ( 리버싱 핵심원리 ) 레지스터란 CPU 내부에 존재하는 다목적 저장 공간입니다. 일반적으로 메모리라고 얘기하는 RAM(Random Access Memory)과는 성격이 조금 다릅니다. CPU가 RAM에 있는 데이터에 접근하기 위해서는 물리적으로 돌아가야하기 때문에 오래걸리지만, 레지스터는 CPU 내부에 존재하므로 고속으로 데이터를 처리할 수 있습니다. IA-32 레지스터의 종류는 다양하지만초급 단계에서는 Basic program execution registers에 대해 알아두어야 합니다.(중/고급 단계에 올라가면 Control registers, Memory management registers, Debug r.. 더보기