security 183

[Dreamhack Wargame] SigReturn Oriented Programming

SROP 개념 정리 void sig_handler(int signum){ printf("sig_handler called.\n"); exit(0); } int main(){ signal(SIGALRM,sig_handler); alarm(5); ~~ 이런 코드가 존재할 때, SIGALRM 시그널이 발생하면 커널 모드로 진입하여 sig_handler 함수를 실행한다. 이 때 시그널을 커널 모드에서 처리하고나서 다시 유저 모드로 돌아와 프로세스의 코드를 실행해야 하므로, 유저 모드의 상태를 모두 기억하고 되돌아올 수 있도록 한다. 현재 프로세스가 바뀌는 것을 컨텍스트 스위칭 (Context Switching) 이라고 하는데, 커널모드 - 유저모드 간 context 스위칭이 발생할 때의 상황을 커널에서 기억하고..

[Dreamhack Wargame] rtld

rtld = Return To LD file 서버 환경이 ubuntu16.04여서 docker로 가상 환경 구축 시도. Image build 계속 실패하길래 https://stackoverflow.com/questions/24991136/docker-build-could-not-resolve-archive-ubuntu-com-apt-get-fails-to-install-a : 이 사이트 참고해서 해결함 sudo docker build --network=host -t ubuntu1604 . Partial RELRO Canary found NX enabled PIE enabled _IO_2_1_stdout_ 주소를 통해 libc_leak 가능 원하는 주소에 원하는 값을 '딱 한 번' 넣을 수 있음 pie_b..

[Dreamhack Wargame] environ

libc_addr leak 가능하고 임의의 주소의 값을 읽어올 수 있다면 __environ 변수를 이용해 stack address leak이 가능하다 how? 기본적으로 리눅스 바이너리는 스택 주소를 포함하지 않기 때문에 스택 주소를 전역 변수에 저장하는 코드가 있지 않는 한 바이너리 주소 내에서 스택 주소를 찾는 것은 불가능하다 환경 변수에 대한 정보는 스택 영역에 존재하며, 라이브러리 함수를 실행할 때에도 해당 정보를 참조하기 때문에 환경 변수를 가리키는 포인터가 라이브러리 내부에 별도로 선언되어 있다 __environ이라는 이름의 전역 변수 시스템 명령어를 실행하기 위한 execve 계열의 함수와 getenv 등 환경 변수와 관련된 함수에서 참조하는 변수 문제 풀이 Full RELRO Canary ..

[Dreamhack Wargame] Overwrite _rtld_global

코드는 간단하다 stdout@@GLIBC_2.2.5 에 담긴 값을 출력해주고 (= _IO_2_1_stdout_ , 라이브러리에 위치) 원하는 주소에 8 byte를 반복적으로 쓸 수 있다 shell 실행시켜주는 함수는 딱히 보이지 않는다 배경지식 1. 라이브러리와 로더가 맵핑된 주소의 간격은 일정하다. 디버깅을 통해 offset 구해놓을 수 있다 0x7fac45f35000 0x7fac4611c000 r-xp 1e7000 0 /lib/x86_64-linux-gnu/libc-2.27.so ~~~ 0x7fac46326000 0x7fac4634d000 r-xp 27000 0 /lib/x86_64-linux-gnu/ld-2.27.so ~~~ - ld_base - libc_base = 0x3f1000 (원격 서버 환..

[Dreamhack Wargame] master_canary (level2)

level 2이지만 master_canary level 1보다 쉬웠다. 도커파일을 이용해 가상환경을 구현해 옾셋 확인할 수 있었음 서버 환경은 다음과 같다. [취약점] thread_routine에 의해 전역변수 global_buffer 포인터에 thread stack의 버퍼 주소가 저장된다 // thread_routine에서 buf = [rbp-0x110], canary = [rbp-0x8] case 2에서 해당 버퍼의 BOF가 가능하다 case 3에서 leave_comment 버퍼의 BOF가 가능하다, RET overwrite to get_shell 하면 될 듯 // leave_comment = [rbp-0x30], canary = [rbp-0x8] [Exploit Scenario] 1. master_..

Dockerfile을 이용해 CTF 문제 환경 구성하기

참고한 사이트 https://yenua.tistory.com/100 https://www.n1net4il.kr/posts/how-to-run-docker-for-ctf https://juntheworld.tistory.com/94 우리는 단일 dockerfile과 단일 container만 있으면 된다. 따라서 Image를 빌드할 때 docker-compose를 사용할 필요가 없고, docker-compose.yml 파일도 따로 생성할 필요가 없다 (여러 컨테이너들을 동시에 관리해야 하는, CTF 서버에서나 필요) Step1. Docker Image를 빌드한다 - Dockerfile이 존재하는 directory로 이동한다 sudo docker build -t my_docker_image . - t옵션을 이..

[Dreamhack Wargame] seccomp

int mode = SECCOMP_MODE_STRICT; int syscall_filter() { #define syscall_nr (offsetof(struct seccomp_data, nr)) #define arch_nr (offsetof(struct seccomp_data, arch)) /* architecture x86_64 */ #define REG_SYSCALL REG_RAX #define ARCH_NR AUDIT_ARCH_X86_64 struct sock_filter filter[] = { /* 현재 아키텍쳐가 x86_64라면 다음 코드로 분기, 아니면 SECCOMP_RET_KILL 반환 후 종료 */ BPF_STMT(BPF_LD+BPF_W+BPF_ABS, arch_nr), BPF_JUMP(..

[Dreamhack Wargame] Bypass SECCOMP-1

"seccomp-tools dump [파일경로]" 를 통해 특정 바이너리의 seccomp 규칙 확인 가능 // 아키텍처 x86-64 아니면 KILL // system call 번호가 0x40000000 미만이면, 그것이 write, open, execve, execveat 과 같은지 비교, 같으면 KILL cf) 왜 A < 0x40000000 검사 코드 존재? - x86-64와 x32, 두 개의 ABI(Application Binary Interface, 바이너리 수준에서의 인터페이스)는 같은 프로세서에서 동작 - x86-64에서는 32 비트 명령어를 호환할 수 있음 - SECCOMP에서 아키텍처를 명시할 때 AUDIT_ARCH_X86_64라는 매크로 사용. 리눅스 커널에서 x86-64와 x32를 동시에..

[Dreamhack Wargame] validator

Level 2라 걱정됐는데 난이도 자체는 그리 높지 않았다. IDA를 사용해 풀어야 하는 문제 int __cdecl main(int argc, const char **argv, const char **envp) { char s[128]; // [rbp-80h] , No Canary memset(s, 0, 0x10uLL); read(0, s, 0x400uLL); // BOF 가능 validate(s, 128LL); return 0; } __int64 __fastcall validate(__int64 a1, unsigned __int64 a2) { int i; // [rsp+1Ch] [rbp-4h] for ( i = 0; i 그러면 DATA 영역에서 쉘코드 실행 가능한거 아닌가?? 또 pop rdx 가젯은 ..

pwn 강좌 메모

/proc/sys/kernel/randomize_va_space의 값을 2에서 0으로 바꾸면 ASLR OFF 가능 $ cat /proc/sys/kernel/randomize_va_space 0 $ echo 2 > /proc/sys/kernel/randomize_va_space scanf로 payload 입력하는데 @plt 주소에 whitespace(\x20 등) 포함되어있을 때 puts@plt 대신 puts@plt+6 를 호출해도 동일함. 입력 종료 방지하기 위해 @plt 대신 @plt+6 사용 (gdb) x/4i $eip => 0x8048320 :jmp DWORD PTR ds:0x804a00c 0x8048326 :push 0x0 0x804832b :jmp 0x8048310 64bit 함수 호출 시 인자..