System Hacking 43

힙 실습 정리2

tcachebins -> fastbins -> unsortedbin 순으로 사용됨. tcachebins에 있는 chunk 주소는 -> fd주소.fastbins에는 있는 chunk 주소는 -> 헤더 주소. fastbins -> tcachebins chunk 이동이 상태에서 malloc 7번을 해주면 tcachebins에 있는 chunk들이 전부 나가고fastbins에 있는 chunk들이 tcachebins로 이동함. __malloc_hook __malloc_hook에 현재는 0이 들어있고 안에 값을 넣어줄거임.AAAA를 넣어줌.RIP가 바뀌면서 넣어준 값을 jmp 했음.유효한 주소였으면 그 주소로 이동했음.만약 원가젯을 __malloc_hook에 넣어주면 쉘 획득이 가능해짐. __free_hookfr..

힙 실습 정리 1

tcachebins LIFO 확인malloc 0x10 을 2번 주고 free로 다시 해제해줌.tcachebins를 보면 먼저 해제해준 chunk가 들어가있음.그리고 다시 malloc을 해주면 마지막에 해제된 영역이 할당됨.-> LIFO 리스트 구조 확인이번에는 3개를 할당/해제 해줌.각각 해제된 영역을 보면 fd에 이전에 해제된 chunk가 적혀있음.가장 처음에 해제된 영역엔 fd에 0이 들어있음. tcache arena 영역 확인그리고 주소들 앞을 보면 [ 3] 이렇게 해제된 chunk의 개수가 적혀있는데,tcache arena안에서도 확인 가능함.그리고 마지막에 해제된 chunk가 적힘.만약 저게 할당되면 다음에 있는 chunk가 적히고 개수는 줄어듬. tcachebins 사이즈 별 관리다른 사이..

docker 정리

초기에 LXC(리눅스 컨테이너스)라는 커널 컨테이너 기술을 이용하여 만든 컨테이너 기술 중 하나. 나무위키 컨테이너는?컨테이너를 설명하자면 '운영체제 수준 가상화'. Linux의 cgroup 과 namespace를 이용하여 호스트 OS와 별개로 동작하는 가상머신 비스무리한 것. 나무위키 well known port : 1 -10000포트10000-65535 2바이트 NAT?network address translation공인ip로 들어왔을때 사설 ip로 넘겨줌. 포트포워딩?공인 ip 몇번 포트는 -> 사설ip 몇번포트로 보내겟음. 공유기 -> 공인ip : 공신력있는 ip, 통신사에서 할당해줌.사설ip : 통신이 안됨. 사설 ip끼리만 통신 가능. docker run -it ubuntu:22.04 ..

Heap힙 /ptmalloc

ptmalloc2 allocator ptmalloc2란?리눅스 GLIBC에서 사용하는 메모리 할당자임. 리눅스 유저모드에서 주로 사용함. chunk가 뭐임...메모리 관리 시스템에서 메모리의 기본 할당 단위. memory allocator가 관리하는 메모리 블록의 단위라고 생각하면됨.chunk는 allocated (사용중인 영역 )/ free (해제되서 재사용 가능한 영역) 두가지 상태로 나뉜다. free chuck들은 bin이라는 자료구조에 의해서 크기별로 관리되고 , free list형태로 구성됨. allocated chunk 와 free chunkprev_size: 이전 힙 청크가 해제되었을 경우 해제된 힙 청크의 크기 저장.size: 할당된 현재 힙 청크의 크기를 저장하고 있고, 3개의 비트 플래..

malloc / 메모리사용

메모리는 malloc -> 사용 -> free패턴으로 사용함. 메모리를 사용하려면 malloc함수를 사용해 메모리 공간을 확보해야한다.메모리 크기는 바이트 단위임.#include #include // malloc, free 함수가 선언된 헤더 파일int main(){ int num1 = 20; // int형 변수 선언 int *numPtr1; // int형 포인터 선언 numPtr1 = &num1; // num1의 메모리 주소를 구하여 numPtr에 할당 int *numPtr2; // int형 포인터 선언 numPtr2 = malloc(sizeof(int)); // int의 크기 4바이트만큼 동적 메모리 할당 printf("%p\n", ..

C언어 포인터 복습

변수는 컴퓨터 메모리에 생성된다.특정한 메모리 주소에 저장됨.서식지정자 %p를 사용하고, 변수 앞에 &를 붙이면 주소를 구할 수 있음. 메모리 주소는 C언어에서 포인터 변수에 저장된다.int *numPtr; 이런식으로 *을 사용해 선언함.즉 포인터와 메모리 주소는 같은 의미임.메모리의 특정 위치를 가리킬 때 사용한다. 변수가 int형이면 이 변수의 메모리 주소를 저장하는 포인트도 int *이어야한다.시스템이 32비트인지 64비트인지에 따라 포인터의 크기가 달라짐.(32비트에서는 4바이트, 64비트에서는 8바이트) #include int main(){ int *numPtr; // 포인터 변수 선언 int num1 = 10; // 정수형 변수를 선언하고 10 저장 numPtr ..

docker 명령어

docker run -it ubuntu:22.04 /bin/bash우분투 22.04 이미지로 새 컨테이너를 생성해서 /bin/bash 쉘을 실행함. docker build . -t diary현재 디렉토리(.)에 있는 Dockerfile을 기반으로 이미지 빌드 docker run -it diary /bin/bash방금 만든 diary 이미지를 기반으로 컨테이너 실행, bash 쉘 진입. docker images로컬에 저장된 도커 이미지 목록 출력. ps -ef | grep prob현재 실행 중인 프로세스 중에서 prob이라는 문자열이 들어간 것 검색.

컴파일(Compile), 링커(Linker) 정리함

소스코드 =>컴파일러 (gcc, clang, MSVC등) => 목적코드 => 링커 (LTO) (주로 컴파일러에 포함)=> 실행파일 어셈블리어랑 기계어 차이점?기계어는 2진수로 이뤄진 CPU가 직접 실행할 수 있는 코드임. 0과 1로된 코드. (binary, hex로 표현)어셈블리어는 어셈블러에 의해서 기계어로 번역되고, 기계어를 사람이 읽기 쉽게 이름을 붙인 거임. (mov eax,1 처럼 표현)컴파일러가 어셈블리어로도 바꿔주고 기계어로도 바꿔줌. 링커가 하는일? 매우 많음위에처럼 여러 개의 목적코드를 하나의 실행파일로 만들어줌.심볼이나 함수 주소를 연결함.LTO를 수행해 최적화함.말고도 더더 많음. LTO: link time optimization ?간단한 함수들을 inline처리해줌 . -> 속도향상..

fsb

보호기법 프로그램 실행%6$llx를 쳐보면 입력한게 문자열로 출력됨.입력한 값이 6번째 인덱스에 있는걸 알았음. %6$llx 해석%6$ → **6번째 인자(argument)**를 참조llx → 그 인자를 unsigned long long (8바이트) 정수로 간주하고→ 그걸 **16진수(lowercase)**로 출력IDA분석 1. fsb가 가능해 첫번째 read에서 got주소를 넣어서 leak해주고2. 두 번째 read에서 got overwrite로 puts_got를 system으로 바꿔서 system("/bin/sh")가 실행되게 함.Exploit1. read_addr leak프로그램 실행에서 6번째 인덱스에 내가 입력한 값이 있는걸 알았으니까7번째 인덱스에 주소를 넣어주고6번째 인덱스를 사용해 %s로..