background
tmux (terminal multiplexer)
tmux는 사용자가 단일 단말기 창 또는 원격 터미널 세션 안에서 여러 별도의 터미널 세션에 액세스할 수 있도록 여러 가상 콘솔을 다중화하는데 사용할 수 있는 응용 소프트웨어이다. 명령어 인터페이스로부터 다수의 프로그램을 처리하고 유닉스 셸로부터 프로그램을 분리하는 데에 유용하다. tmux를 실행하게 되면 하나의 세션을 가지고 시작하며 세션 아래의 윈도우를 여러 개 띄울 수 있다. 또한 하나의 윈도우에서 팬을 사용해 영역을 나눠서 표시할 수 있다. 설치 방법 $ brew install tmux // mac $ sudo apt-get install tmux// linux 세션 관련 명령어 // 세션 생성 (이름은 숫자로 생성됨) $ tmux // 이름을 지정하여 세션 생성 $ tmux new -s $ tm..
return-to-csu x64 (RTC, JIT ROP)
return-to-csu는 __libc_csu_init() 함수의 일부 코드를 Gadget으로 이용하는 기술이다. __libc_csu_init() 함수는 프로그램 실행 시 _init() 함수와 __preinit_array, __init_array 에 설정된 함수 포인터를 읽어서 함수를 호출한다. gdb-peda$ disassemble __libc_csu_init Dump of assembler code for function __libc_csu_init: 0x00000000004011a0 : endbr64 0x00000000004011a4 : push r15 0x00000000004011a6 : lea r15,[rip+0x2c63] # 0x403e10 0x00000000004011ad : push r14..
[glibc-2.27] fwrite & fputs
드림핵 강의를 보고 glibc-2.27을 분석한 글 입니다. (틀린 내용이 있을 수 있습니다) 파일에 데이터를 쓰기 위한 함수는 대표적으로 fwrite, fputs가 있다. 해당 함수는 라이브러리 내부에서 _IO_sputn 함수를 호출한다. 해당 함수는 _IO_XSPUTN 함수의 매크로이며 실질적으로 _IO_new_file_xsputn 함수를 실행한다. 이 함수에서는 파일 함수로 전달된 인자인 데이터와 길이를 검사하고 _IO_OVERFLOW(_IO_new_file_overflow) 함수를 호출한다. 실제 파일에 내용을 쓰는 과정은 _IO_new_file_overflow를 시작으로 다양한 함수가 호출되면서 이루어진다. fwrite fwrite 함수는 _IO_fwrite 함수의 다른 이름이며 iofwrite..
[glibc-2.27] fread & fgets
드림핵 강의를 보고 glibc-2.27을 분석한 글 입니다. (틀린 내용이 있을 수 있습니다) 파일의 내용을 읽기 위한 함수는 대표적으로 fread, fgets가 있다. 해당 함수는 라이브러리 내부에서 _IO_file_xsgetn 함수를 호출한다. 실제 파일의 내용을 읽는 과정은 _IO_new_file_underflow를 시작으로 다양한 함수가 호출되면서 이루어진다. fread fread 함수는 _IO_fread의 별칭으로 iofread.c 에 정의되어 있다. _IO_size_t _IO_fread (void *buf, _IO_size_t size, _IO_size_t count, _IO_FILE *fp) { _IO_size_t bytes_requested = size * count; _IO_size_t ..
[glibc-2.27] _IO_FILE & fopen
드림핵 강의를 보고 glibc-2.27을 분석한 글 입니다. (틀린 내용이 있을 수 있습니다) 먼저, 드림핵에서 소개하는 예제 코드는 다음과 같다. // Name: iofile.c // Compile: gcc -o iofile iofile.c #include #include #include void file_info(FILE *buf) { printf("_flags: %x\n", buf->_flags); printf("_fileno: %d", buf->_fileno); } int main() { FILE *fp; char buf[256]; strcpy(buf, "THIS IS TESTFILE!"); fp = fopen("testfile", "w"); fwrite(buf, 1, strlen(buf), fp..