security/포너블 - dreamhack 22

[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 함수 호출 시 인자..

[Dreamhack Wargame] Cat-Jump

Step1: 일단 else if문을 통과해 CAT-JUMP를 37번 해야함 void StartGame() { char cat_name[32]; char cmd[64]; // 생략 srand(time(NULL)); catnip = 0; jump_cnt = 0; puts("let the cat reach the roof! 🐈"); sleep(1); do { obstacle = rand() % 2; do { printf("left jump='h', right jump='j': "); scanf("%c%*c", &input); } while (input != 'h' && input != 'l'); if (catnip) { catnip--; jump_cnt++; puts("the cat powered up and..

[Dreamhack Wargame] STB-lsExecutor

소스코드이다. 처음엔 필터링 우회해서 효과적인 command를 구성하려 했는데 어림도 없더라 read_data(data,60); size = snprintf(command, 30, "ls -%s ", data); printf("Enter path : ") read_data(&command[size], 70); system(command) ** snprintf 취약점 ** snprintf는 두 번째 인자로 size(입력받을 input 크기)를 지정할 수 있지만 snprintf의 반환값은 버퍼에 실제로 쓰인 문자의 수가 아니라, 버퍼가 무한하다고 가정했을 때 쓰이게 될 문자의 수라고 한다 따라서 read_data에서 data에 60자 입력 시, 마지막 null 바이트 치환되면서 59자가 되고 size = 0..