OS/LINUX & UNIX
Shell Script
Shell Script
2021.03.15linuxsig.org/files/bash_scripting.html Table 1: Built-in shell variables. Variable Use $# Stores the number of command-line arguments that were passed to the shell program. $? Stores the exit value of the last command that was executed. $0 Stores the first word of the entered command (the name of the shell program). $* Stores all the arguments that were entered on the command line ($1 $2 ...). "..
shell prompt (bash, Oh My Zsh)
shell prompt (bash, Oh My Zsh)
2020.01.10bash Ctrl+Backspace로 단어 삭제하도록 만들기 ```c +++ /etc/inputrc 또는 ~/.inputrc "\C-h": backward-kill-word ``` 이렇게 설정했는데 backspace만 눌러도 한 단어가 지워지는 경우? 더보기 backspace를 누르면 ``c ^?``(0x7f)를 보내도록 되어 있고, Ctrl+backspace를 누르면 ``c ^H``(0x08)을 보내도록 되어 있는게 일반적임 Ubuntu bash 터미널, mac의 iterm2는 이와 같은 식으로 키코드가 발생함 그러나 xshell같은 SSH Client에서는 기본 backspace 키 시퀀스가 ``c ^H``로 설정돼 있어 이런 경우 그냥 backspace만 눌러도 1단어가 지워진다. 기본 키 시퀀스를..
바이너리를 쉘 명령어로 등록하기 (+ 버전 관리, 멀티 패키지)
바이너리를 쉘 명령어로 등록하기 (+ 버전 관리, 멀티 패키지)
2019.05.14PATH shell에 명령어를 입력하게 되면 환경 변수 `` PATH``에 등록된 경로를 차례로 뒤져가면서 해당 명령어와 일치하는 바이너리가 있는지 찾는다. `` /usr/bin``에 위치한 바이너리가 쉘에서 별도의 prefix 없이 명령어로서 사용할 수 있는 것은, 이 경로는 기본으로 `` PATH``에 등록되어 있기 때문 패키지를 수동 설치 하거나 바이너리를 직접 가져온 경우, 이를 명령어로 등록하고 싶다면? 해당 바이너리가 위치한 경로를 환경변수 `` PATH``에 추가하는 방법 PATH 관리가 좀 지저분해질 수 있다. 해당 바이너리만 `` /usr/bin``으로 직접 symbolic link하는 방법 가능은 하지만 단점이 있음. 버전이 여러 개인 경우. 예를 들면 java8, java12나 pyt..
SSH 접속 끊어도 프로세스 돌아가도록 하기 : screen, disown, 백그라운드 작업
SSH 접속 끊어도 프로세스 돌아가도록 하기 : screen, disown, 백그라운드 작업
2017.11.13```bash screen -S [sessionname] // session 생성 및 진입 ``` 새로운 session에서 프로세스 실행하면 SSH 끊어도 생성한 session과 프로세스가 계속 실행된다. ```bash Ctrl-a, d || screen -d // session 실행은 유지하면서 원래 shell로 나가기 ``` ----------- SSH 접속 종료 ----------- . . . . . . . . . . . . . . . . . . . . . . . . . ----------- 다시 SSH 접속 ----------- ```bash screen -ls // session list 출력 screen -r [[pid.]tty[.host]] // 다시 session으로 되돌아가서 작업 결과 ..
gcc options
gcc options
2017.10.01gcc공유 라이브러리 제작 / 사용 옵션```-fPIC```PIC : Position-Independent Code를 생성한다.shared library같은 경우 메모리의 어느 위치에 로딩되는지가 컴파일 타임에 결정되지 않기 때문에 절대주소 대신 상대주소(offset)를 사용하도록 컴파일하는 옵션이다. 즉, 다른 바이너리에서 이 라이브러리의 함수를 호출할 때 PLT와 GOT를 사용하도록 하는 옵션이라고 생각하면 된다.library의 mapping 주소 + offset이 해당 symbol의 주소가 된다. mapping 주소는 ldd로, offset은 nm으로 확인 가능하다. ```-shared```shared library(.so)를 생성하겠다는 의미. ```-llibrary```library는 함수 이름..
libc 버전 문제
libc 버전 문제
2017.07.23libc.so 파일을 실행하면 버전, 컴파일 시스템 등등 정보가 출력된다.* glibc source는 하나지만, 컴파일 환경(OS, Compiler)에 따라 같은 버전의 다른 libc.so가 컴파일된다.* libc 버전에 따라 에러가 발생하는 경우는 확인했는데, 같은 버전에 시스템이 다른 경우(e.g., Debian과 Ubuntu) 에러가 발생하는건 아직 못봤다. #1바이너리를 컴파일한 시스템의 libc 버전과 바이너리를 실행하는 현재 시스템에서 사용하는 libc 버전이 다른 경우 relocation error가 발생할 수 있다. #2현재 시스템에서 사용하는 libc 버전과는 다른 버전의 libc를 `` LD_PRELOAD``를 이용해 지정해 실행하는 경우, relocation error가 발생하거나 s..
SSH Server 설정
SSH Server 설정
2017.05.22SSH server Ubuntu server가 아니면 SSH를 따로 설치해주어야 한다. ```bash sudo apt-get install openssh-server ``` 이후 설정은 다음을 참고. http://www.drchaos.com/enable-ssh-on-kali-linux-enable-ssh-on-kali-linux/ https://lmgsecurity.com/enable-start-ssh-kali-linux/ SSH root 계정 접속 제한 ```bash vi /etc/ssh/sshd_config PermitRootLogin no vi /etc/pam.d/login Auth required /lib/x86_64-linux-gnu/security/pam_securetty.so ``` 공개키를..
STDIN _IO_FILE structure <_IO_2_1_stdin_> & fgets VS argv
STDIN _IO_FILE structure <_IO_2_1_stdin_> & fgets VS argv
2017.05.09STDIONote ) 파이프와 STDIO는 다르다!파이프는 키보드나 모니터같은 하드웨어 장치와 프로세스를 연결하는 방법이 아니라, 한 프로세스의 stdout을 다른 프로세스의 stdin으로 연결하는 IPC 방법이다. 따라서 STDIO는 pipe 구조로 이루어져 있는 것이 아니다! pipe에 접근하든 STDIO에 접근하든 file philosophy에 의해 `` fd``를 이용해 접근하기 때문에 착각할 수 있음. 파이프로 리다이렉션 하지 않는 경우 stdin, stdout, stderr은 모두 같은 character device를 가리키면서, read-only가 아니다.따라서 `` stdin``을 이용해 출력하거나, `` stdout``을 이용해 데이터를 쓰는 것이 가능하다.* stdio를 PIPE로 리다..
[*-nix] 패키지 관련 및 OS update & upgrade
[*-nix] 패키지 관련 및 OS update & upgrade
2017.04.13apt* family apt-get 대신 그냥 apt를 사용해도 된다. ```bash apt-get update package_name apt-get upgrade package_name ``` `` apt-get update`` : updates the list of available packages and their versions, but it does not install or upgrade any packages. `` apt-get upgrade`` : actually installs newer versions of the packages you have. After updating the lists, the package manager knows about available updates f..
[procfs_search.h] 메모리에서 특정 값의 주소 찾기
[procfs_search.h] 메모리에서 특정 값의 주소 찾기
2017.03.08https://github.com/umbum/pwn/blob/master/tools/procfs_search.h procfs에서 메모리 주소를 받아와 메모리 공간 내의 특정 값의 위치를 출력하는 프로그램.gdb가 너무 구버전이라 find 명령어가 없는 경우 쓸만하다.* `` objdump`` 또는 `` xxd``를 사용할 수 있지만 code section만 조회되며 동적으로 결정되는 다른 section, 예를 들면 so나 stack의 데이터는 찾을 수 없다. Usage파라미터 설정은 int mem_search(long startaddr, long endaddr)에서 하고procfs_search()를 호출하면 알아서 돌아간다. char target_array[] : 찾을 value. "/bin/sh"같은 ..
생성자, 소멸자 low-level
생성자, 소멸자 low-level
2017.01.13소멸자.dtors```080495f4 d __DTOR_END__```소멸자로 프로그램이 종료되기 전에 여기에 명시되어 있는 주소(함수)가 호출된다.`` __DTOR_END__``의 위치는 nm을 사용해도 좋고 readelf나 objdump로 확인해도 좋다. .fini_arraygcc 4.7 이상 버전은 .ctors .dtors를 사용하지 않는 대신 다음을 사용한다.``` [18] .init_array INIT_ARRAY 0000000000600e10 00000e10 0000000000000008 0000000000000000 WA 0 0 8 [19] .fini_array FINI_ARRAY 0000000000600e18 00000e18 0000000000000008 0000000000000000 WA 0..
secure-execution mode
secure-execution mode
2017.01.11secure-execution mode어떤 바이너리를 실행하면, dynamic linker(ld.so)는 getauxval()를 이용해 auxiliary vector인 `` AT_SECURE`` 값을 가져와 ``c 0``인지 확인하고 ``c 0``이 아니면 secure-execution mode로 실행한다.2017/09/02 - [System/Exploit] - Return to VDSO using ELF Auxiliary Vectors leck 다음과 같은 경우, ``c AT_SECURE != 0``이 된다.``c eUID != rUID`` 또는 ``c eGID != rGID`` 인 경우 ( => setUID나 setGID가 걸려있는 경우 )non-root UID process가 capability를 ..