본문 바로가기

reversing

EPROCESS(PEB), ETHREAD(TEB), KPROCESS(PCB), KTHREAD(TCB)

EPROCESS(PEB), ETHREAD(TEB), KPROCESS(PCB), KTHREAD(TCB)커널 디버깅을 하면서 몇가지 공부한 사실을 정리한다.EPROCESS(Executive Process)와 ETHREAD(Executive Thread)는 process가 생성될 때 kernel 메모리에 생성되는 구조체이다.user 메모리에 생성되는 구조체로는 이와 대응되게 PEB(Process Environment Block), TEB(Thread Environment Block)가 있다.위와 같은 구조로 프로세스가 관리된다.PEB와 TEB는 system call 호출로 매번 EPROCESS와 ETHREAD에서 정보를 가져오기에는 성능상의 이슈가 발생하기 때문에 존재하는 것이라고 한다.KPROCESS(Pro..

더보기
reversing

windows paging - x86, 64

windows paging - x86, 64윈도우 운영체제는 가상 메모리를 사용한다.디버깅을 경험해봤다면 프로그램이 대부분 0x400000의 주소부터 시작하는 것을 볼 수 있는데, 이렇게 동일한 주소에 접근해도 데이터가 프로세스별로 다를 수 있는 것은 바로 가상 메모리 때문이다.0x400000이라는 주소는 논리 주소가 세그멘테이션된 선형 주소이다.선형 주소는 비트별로 나뉘어 페이징을 통해 물리적 주소가 되고, 이 물리적 주소가 실제 메모리 주소가 된다.우리가 디버거에서 보는 주소는 가상 주소, 즉 선형 주소이기 때문에 각 프로세스별로 동일한 메모리에 접근해도 값이 상이할 수 있는 것이다.논리 주소 -> 선형 주소선형 주소 -> 물리 주소AMD64의 paging은 다소 복잡하게 진행될 수 있다.선형 주소를..

더보기
writeup

x-mas ctf 2019 deadfile

2019 x-mas ctf deadfilebinary info[*] '/home/krrr/pwn/x-mas/dead_file/deadfile' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE enabled메뉴형 heap challenge이다. line CODE JT JF K ================================= 0000: 0x20 0x00 0x00 0x00000004 A = arch 0001: 0x15 0x00 0x0d 0xc000003e if (A != ARCH_X86_64) goto 0015 0002: 0x20 0x00 0x00 0x00000000 A = sys_number 0..

더보기
material

linux file vtable check bypass

linux file vtable check bypassvtable check (glibc >= 2.24)/* _IO_vtable_check Source: https://code.woboq.org/userspace/glibc/libio/vtables.c.html#_IO_vtable_check */ ​ void attribute_hidden _IO_vtable_check (void) { #ifdef SHARED void (*flag) (void) = atomic_load_relaxed (&IO_accept_foreign_vtables); #ifdef PTR_DEMANGLE PTR_DEMANGLE (flag); #endif if (flag == &_IO_vtable_check) return; { Dl_info..

더보기
writeup

2019 d3ctf lonely_observer

2019 d3ctf lonely_observerpipe https://12bme.tistory.com/226d3ctf writeup https://www.anquanke.com/post/id/193939#h3-9pipe를 이용한 IPC를 구현한 바이너리이다.총 2개의 바이너리 mimic32, mimic64와 IPC 통신을 진행한다.간단하게 lonely_observer 바이너리에서 각각의 thread로 입력, 출력을 받고 이를 출력해준다.요로코롬 thread를 만들어서 각각의 바이너리를 관리한다.그리고 밑에서 buf에 입력을 받아 mimic32, mimic64에 전달해준다.근데 문제는 main_thread에서 memcmp로 mimic32, mimic64의 출력값을 비교한다.출력값이 같지 않으면 handle..

더보기