OS/LINUX & UNIX
ltrace & strace
ltrace & strace
2017.01.07ltracelibrary trace. userspace API call의 흐름을 볼 수 있다.```bash-S -- Display system calls as well as library calls``` strace ( man )system call trace. system call의 흐름을 볼 수 있다.출력되는 binary값이 16진수가 아니라 8진수 이므로 주의!```bash-i -- print instruction pointer at time of syscall-f -- follow forks, -ff -- with output into separate files-e func -c | -C -- count time, calls, and errors for each syscall and report ..
/proc/<pid>/maps
/proc/<pid>/maps
2017.01.04proc filesystemman procprocfs ( proc filesystem )은 유닉스 기반 OS에서 프로세스에 대한 정보나, 시스템 정보를 파일 형식으로 제공하는 것을 말한다. `` /proc/``의 파일들을 확인해보면 크기가 0인데, 이는 procfs 파일은 내부 자료구조에 접근하기 위한 인터페이스에 가깝기 때문이다.procfs 파일을 출력하려는 순간, procfs driver가 system call을 수행하여 procfs 파일에 대한 결과값으로 출력할 내용을 생성하게 되고, 이를 procfs 파일을 통해 출력하는 것이다.때문에 출력되는 procfs의 내용은 디스크에 존재하지도 않고, 메모리에 적재되어 있는 것도 아니며 크기가 얼마가 될지는 런타임에 결정되기 때문에 알 수 없어 0으로 잡힌..
[Ubuntu] 초기 설정 / 업데이트
[Ubuntu] 초기 설정 / 업데이트
2016.12.25https://subicura.com/2017/11/22/mac-os-development-environment-setup.html[OS/LINUX & UNIX] - [*-nix] apt* family 및 OS update & upgrade[OS/LINUX & UNIX] - Java 관련 (JDK, 설치, ...)[OS/LINUX & UNIX] - SSH Server 설정 한글 설정 18.04 LTS메뉴-검색 - Language support 들어가서 `` Install/Remove Language`` 클릭하고 Korean 설치.재부팅메뉴-검색 - input sources 들어가서 Korean (Hangul) 추가. ( 꼭 이거여야 함. 그냥 Korean이나 Korean 101이런거 말고.) 원래 우분투..
ptrace
ptrace
2016.12.25ptrace ( process trace )```c#include long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);```ptrace를 호출하는 tracer 프로세스가 타겟 프로세스인 tracee 프로세스를 컨트롤할 수 있도록 하는 함수.gdb에서도 내부적으로는 ptrace를 사용한다.windows에서는 ATTACH에 ``c DebugActiveProcess()``를 사용하고, 아직 실행되지 않은 프로그램을 디버거로 실행할 때는 ``c CreateProcess()``에서 `` dwCreationFlags`` 속성에 `` DEBUG_PROCESS``를 지정해서 실행한다.그러나 Unix-based 에서는 둘 다 ``c ..
[excp] 읽기 권한 없는 파일 복사하기
[excp] 읽기 권한 없는 파일 복사하기
2016.12.21쓰기 권한으로 파일 복사하기원래 읽기 권한이 있어야 파일 복사가 가능하도록 되어있지만, 실행 권한이 있는 경우 읽기 권한이 없어도 ptrace를 이용해 파일을 복사하여 내 소유 파일로 얻어낼 수 있다.파일을 실행하게 되면 해당 파일이 메모리에 적재된다는 점을 이용하여, ptrace로 프로세스의 가상메모리 공간 중 실행한 파일이 매핑된 공간에 접근해서 데이터를 추출해 파일에 쓴다.이렇게 얻어낸 파일은 원본 파일과 동일하게 동작하며, 얻어낸 파일에 gdb, strings 등을 사용할 수 있기 때문에 유용하게 활용할 수 있다.* 얻어낸 파일이 원본 파일과 완전히 동일하지는 않다.file 명령어 등을 이용해 속성을 확인해보면 손상된 것으로(stripped) 나온다. readelf : 섹션 안나옴, objdump..
.s 파일 수정
.s 파일 수정
2016.12.10자주 사용하는 shellcode를 -S 옵션으로 컴파일 한 결과 파일( inlineasm.s )`` __volatile__``을 사용했기 때문에 입력한 어셈블리 그대로 컴파일 되었다.```c .file "inlineasm.c" .version "01.01"gcc2_compiled.:.text .align 4.globl main .type main,@functionmain: pushl %ebp movl %esp,%ebp#APP push $0x0 push $0x0068732f push $0x6e69622f mov %esp, %ebx push $0x0 push %ebx mov %esp, %ecx mov $0x0, %edx mov $0xb, %eax int $0x80 #NO_APP.L1: leave ret.Lf..
GOT( Global Offset Table ) Layout과 link_map structure
GOT( Global Offset Table ) Layout과 link_map structure
2016.12.09ELF 파일의 Section header를 조사하여 got의 위치를 얻을 수 있다.위 파일의 got 크기는 0x20이므로 32byte임을 알 수 있다. `` Partial-RELRO``(default) 바이너리는 .got.plt를 사용한다. 이 경우 .got는 4byte에 0만 들어있다.`` Full-RELRO`` 옵션으로 컴파일된 바이너리는 .got를 사용한다. 이 경우 .got.plt가 아예 없다.따로 옵션을 주지 않으면 partial-RELRO로 컴파일되므로, .got.plt( 0x0804a000 )가 got라고 생각하면 된다. * 구식 OS는 .got.plt 없이 그냥 .got가 .got.plt를 포함하고 있는 경우도 있다. got[0], 첫번째 entry는 이 module(실행 파일)의 dyna..
[Linux] Memory Layout, Segment + Kernel
[Linux] Memory Layout, Segment + Kernel
2016.11.212017/01/04 - [System/LINUX & UNIX] - procfs stack의 최대 크기는``c RLIMIT_STACK ( usually 8MB, 0x08000000 )``이다. * 한 번 확장된 stack top은 다시 줄어들지 않는다.Text segment의 시작지점은 보통 ``c 0x08048000``이지만, 항상 그런 것은 아니다.dynamic library는 stack과 heap의 중간 Memory Mapping Region에 mapping되고, static library는 text segment에 mapping된다.Memory Mapping Region의 경우 library mapping 이외의 용도로도 사용되는데, anonymous memory mapping이라고 부르며, ``c..
[compile process] Shared Library
[compile process] Shared Library
2016.11.21windows에서 lib과 dll을 사용하듯, Linux-based system에서도 비슷한 개념의 라이브러리가 존재한다.크게 static library와 shared library로 나뉘며, shared library가 다시 link 시점에 따라 나뉜다. Linking과 Loading의 차이LinkingAll of the object files and any libraries are linked together to make your final program. For static libraries, the actual library is placed in your final program, while for shared libraries, only a reference to the library is ..
main startup routine bt
main startup routine bt
2016.11.15`` main``의 상위 frame은 `` __libc_start_main``이다. __libc_start_main`` __libc_start_main``은 `` init, fini, stack_end`` 등을 인자로 받는데, 첫 번째 인자로 `` main``의 함수 포인터를 받는다.```cint __cdecl _libc_start_main(int (__cdecl *main)(int, char **, char **), int argc, char **ubp_av, void (*init)(void), void (*fini)(void), void (*rtld_fini)(void), void *stack_end) .text:0000000000000A5D lea rdi, main ; main.text:000000..
[setuid] ruid, euid
[setuid] ruid, euid
2016.11.15passwd 등 내부적으로 `` ruid``를 체크하는 작업을 수행하려면 `` ruid``를 변경해 주어야 한다. `` setuid`` bit가 설정 되어있는 바이너리를 실행하면 `` euid``가 변경된다. `` ruid``는 `` euid``가 변경된 상태에서 직접 ``c setuid()``를 호출해줄 때 변경된다. 때문에 ``c setuid()``를 호출하지 않는 바이너리를 이용해 쉘을 실행하더라도 `` euid``만 변경되고 `` ruid``는 그대로인 상태다.이런 경우, 쉘을 실행하기 전에 ``c setuid()``도 실행하도록 하면 ``c ruid == euid``인 쉘을 얻을 수 있다.`` euid``만 변경된 쉘에서 ``c setuid(geteuid()) / system("/bin/sh")..
[shell] pipe
[shell] pipe
2016.11.03pipe란? 한 프로세스의 `` stdout``을 다른 프로세스의 `` stdin``으로 연결하는 IPC 방법이다. 파이프 한 개(r, w 한 쌍) 당 한 쪽 방향으로만 사용할 수 있다. ``` ↓ docking! ↓ -------pipe------- ---------process--------- -------pipe------- w -> r ⇒ stdin stdout ⇒ w -> r -------pipe------- ---------process--------- -------pipe------- ``` 이름없는 파이프 ```bash echo .... | File ( ...; cat ) | File ``` `` A | File`` : A의 표준 출력을 File의 표준 입력으로 연결한다. fifo ( na..