Security/pwnable
[pwnable] - glibc 2.24 이상 버전에서 _IO_FILE vtable check bypss
[pwnable] - glibc 2.24 이상 버전에서 _IO_FILE vtable check bypss
2020.10.07`glib 2.24` 이상 버전 부터 `_IO_validate_vtable()` 로 `vtable`을 검사한다. 이 때문에 `vtable` 값을 공격자가 원하는 함수의 주소로 overwrite 할 수가 없다. 하지만 `glibc 2.27` 버전까지 이를 bypass 할 수 있는 방법이 있는데, `_IO_str_overflow()` 함수와 `_IO_str_finish()` 함수를 이용한 bypass 공격 방법이 있다. 아래 설명하는 내용은 `glibc 2.29` 버전에 패치 되었다. _IO_validate_vtable() 이 함수는 `glibc 2.24` 이상 버전에서 생긴 함수로, `vtable` 값를 검사한다. 검사 방법은, `_libc_IO_vtables` 의 섹션 크기를 계산한 후 파일 함수가 호출..
[pwnable] - _IO_FILE structure and vtable overwrite
[pwnable] - _IO_FILE structure and vtable overwrite
2020.10.02_IO_FILE 리눅스 시스템의 표준 라이브러리에서 파일 스트림을 나타내기 위한 구조체입니다. 이 구조체는 `fopen()`, `fwrite()`, `fclose()` 등 파일 스트림을 사용하는 함수가 호출되었을때 할당 됩니다. `_IO_FILE`의 구조체는 다음과 같습니다. struct _IO_FILE { int _flags;/* High-order word is _IO_MAGIC; rest is flags. */ /* The following pointers correspond to the C++ streambuf protocol. */ char *_IO_read_ptr;/* Current read pointer */ char *_IO_read_end;/* End of get area. */ char..
[pwn] - pwntools 로 PIE base 구하기
[pwn] - pwntools 로 PIE base 구하기
2020.02.23바이너리에 PIE가 걸려 있다면, 디버깅 할때 주소가 랜덤으로 바뀌어 breakpoint를 걸 수 가 없다. 하지만 PIE base를 구할 수 있다면, 주소가 랜덤으로 바뀌어도 breakpoint를 걸 수 있다. 바로 아래 코드가 중요하다. pie_base = p.libs()["바이너리 절대 경로"] 간단한 예를 보면 다음과 같다. from pwn import * context.terminal = ['tmux', 'splitw', '-h'] context.log_level = 'debug' p = process("./challenge") e = ELF("./challenge",checksec=False) pie_base = p.libs()["/home/ubuntu/environment/ctf/pwnabl..
[pwn] - environ 변수로 stack leak 하기
[pwn] - environ 변수로 stack leak 하기
2020.02.23environ 변수를 이용해 stack leak 를 하는 방법이다. 이 공격을 하기 위해 다음과 같은 가정이 필요하다. libc base 주소를 알고 있다. 임의의 주소를 leak 할 수 있다. gdb-peda$ p 0x00007ffff79e4000 + 0x861a5c8 $2 = 0x7fffffffe5c8 gdb-peda$ p environ $3 = (char **) 0x7fffffffe5c8 gdb-peda$ x/gx $rsp 0x7fffffffe4d8: 0x00007ffff7a05b97 gdb-peda$ p 0x7fffffffe5c8 - 0x7fffffffe4d8 $4 = 0xf0 gdb-peda$ libc base address: 0x00007ffff79e4000 environ offset: 0x8..
64bits 인자 값 전달 방식 순서
64bits 인자 값 전달 방식 순서
2020.01.28[Linux - ELF] Parameter 1 - rdi Parameter 2 - rsi Parameter 3 - rdx Parameter 4 - rcx Parameter 5 - r8 Parameter 6 - r9 Parameter 7 - (%rsp) Parameter 8 - 0x8(%rsp) system call - %rax
[bof] - RTL Chaining 공격 기법
[bof] - RTL Chaining 공격 기법
2019.09.29Return to Libc Chaining 0x01 What is it? RTL 공격에서 RET 주소를 변조하여 하나의 공유 라이브러리 함수를 호출 했다면, RTL Chaining 공격 기법은 RTL 공격 기법을 응용하여 여러개의 공유 라이브러리 함수를 호출 할 수 있다. 0x02 Prior knowledge 이 공격 기법을 처음 보고 이해하기는 힘들 수도 있다. (필자가 그랬다…ㅇㅇ) 이 글을 이해하기 위해서는 호출된 함수가 인자를 가져오는 방법과 Return to libc 공격 기법을 이미 숙지 했다라는 기준으로 설명을 하겠다. (모른다면 링크 클릭) Return to Libc 아래와 같은 코드가 있다고 가정하자. read 함수에서 buf 변수 크기 이상으로 값을 받고 있다. 여기서 bof가 발생하는..
[bof] - Frame faking (Fake EBP) 공격 기법
[bof] - Frame faking (Fake EBP) 공격 기법
2019.09.250x01 what is Frame faking Frame faking 공격은 RET까지 덮어 쓸 수 있는 상태이고 RET에 스택 또는 라이브러리 주소 등을 덮어 씌울 수 없는 상황일때 사용하는 공격 기법이다. 이 공격 기법은 SFP를 덮어씌우고 RET 주소를 leave 주소로 덮어씌워 buf에 있는 shellcode를 실행하게 할 수 있다. 0x02 Concept 이 글은 64bit를 기준으로 설명을 적었다. 우선 이 공격을 배우기 위해서는 LEAVE 명령어와 RET 명령어에 대해 알고 있어야 한다. LEAVE MOV ESP, EBP POP EBP RET POP EIP JMP EIP 스택이 아래처럼 구성이 되어 있다고 가정하자. 이 스택을 잘 기억해야 헷갈리지 않을 것이다. (아래로 갈수록 high ad..
[bof] - Return to Libc (RTL) 공격 기법
[bof] - Return to Libc (RTL) 공격 기법
2019.09.250x01 What is it? RTL 공격은 스택에 NX-bit 보안 기법이 적용 되었을때 사용하는 공격 기법이다. NX란 Never eXecutable stack 을 줄인 말로 "스택에서 코드 실행 불가" 라는 보안 역할을 한다. NX-bit 때문에 스택에서 shellcode를 삽입하고 이 주소를 RET에 overwrite 해도 실행되지 않아 공격이 실패하게 된다. 이를 우회 하기 위한 기법이 Return to Libc 이다. Return to Libc은 공유 라이브러리 함수의 주소를 가져와 RET에 overwrite 하고 이를 호출하는 공격 기법이다. 바이너리에 호출하려는 함수가 없어도 이미 메모리에 적재되어 있는 공유 라이브러리 함수의 주소를 가져와서 사용이 가능하다. 0x02 Prior knowl..
[bof] - Return to Shellcode 공격 기법
[bof] - Return to Shellcode 공격 기법
2019.09.25# What is it?? Return to Shellcode는 Return address 값을 shellcode가 저장된 주소로 변경해, shellcode를 호출하는 방식이다. Return address 값은 보통 어셈블리어에서 CALL 또는 RET 명령어를 호출 후 스택에 저장이 된다. # CALL & RET CALL 명령어는 다음과 같은 행위가 이루어진다. CALL PUSH ReturnAddress JMP CALL 명령어는 CALL 명령어 다음 명령어의 주소 값을 stack에 저장하고 피연산자 주소로 이동한다. 현재 ESP가 다음 명령어로 이동할 주소 값을 가르키고 있고, 이때 RET 명령어는 POP 명령어로 EIP에 저장하고 해당 주소로 이동한다. RET POP EIP JMP EIP # Previ..