일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 패시브스캐닝
- decap
- 대학원
- SecurityMetric
- davtest
- Kublet
- recon-ng
- 화이트해커
- airdecap-ng
- Chrome 작업관리자
- dnsenum
- 무선채널
- Social Network in Game
- AttackGraph
- 강의
- Container
- OIDC
- 공격그래프
- 보안
- Shift + ESC
- Mac
- ip forwarding
- OpenID Connect
- 액티브스캐닝
- Mimikatz
- 넷크래프트
- NMAP
- cgroups
- 계정 탈취
- 프로젝트
- Today
- Total
목록강의 정리 (15)
네른
1. RTL - NX를 우회하는 대표적인 기법. - 라이브러리에는 system, execve등 공격에 용이한 다양한 함수들이 있음 - NX로 인해서 코드를 실행할 수 없으니, "실행 권한이 있는" 코드 영역으로 Return address를 덮자. // Name: rtl.c // Compile: gcc -o rtl rtl.c -fno-PIE -no-pie #include #include const char* binsh = "/bin/sh"; int main() { char buf[0x30]; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); // Add system function to plt's entry system("echo 'system@p..
1. 라이브러리? - 함수, 변수 등을 공유해서 사용할 수 있도록 자주 사용하는 함수들의 정의를 묶어 하나의 라이브러리로 만들어 제공 - libc라는 C의 표준 라이브러리는 어디에나 탑재되는 편 2. 링크? - 컴파일의 마지막 단계 - 프로그램에서 라이브러리의 함수를 사용하는 경우, 함수와 실제 라이브러리의 함수를 연결해줌! - 심볼과 관련된 정보를 찾아서 실행 파일에 링크(연결)해 줌! - 리눅스의 경우 다음과 같은 표준 라이브러리들이 gcc 빌드시에 항상 들어가게 됨. - 이 표준 라이브러리들은 컴파일될때 모두 탐색됨!! $ ld --verbose | grep SEARCH_DIR | tr -s ' ;' '\n' SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu") SEA..
NX : No-Execute의 약자로, 메모리 영역의 실행 권한을 제거 ASLR : Address Space Layout Randomization의 약자로, 바이너리가 실행될 때 마다 스택, 힙, 라이브러리등을 "임의의 주소"에 배치시키는 것 1. ASLR ASLR을 사용하면 앞에서 배웠던 기법중에 buffer의 주소같은것을 알 수가 없게 된다. 그래서 이 buffer의 주소를 출력하는 공격이 선행되어야 한다. - ASLR은 커널단에서 지원하는 보안 기법! - cat /proc/sys/kernel/randomize_va_space 를 통해 확인할 수 있으며 0인경우 꺼져있는 것 그러나 ASLR이 완전 랜덤화는 아니라는 점 $ ./addr buf_stack addr: 0x7ffcd3fcffc0 buf_he..
스택 카나리 보호기법 - 함수의 프롤로그에서 return address와 버퍼 사이에 임의의 값을 삽입함 - 함수의 에필로그에서 해당 값이 변조되었는지 확인함 Why? - Return address를 덮어씌우려면 반드시 그 앞의 버퍼를 채우면서 지나가게 되므로 BOF 공격을 막을 수 있음 - stack canary가 적용된 바이너리에 BOF 공격을 그대로 수행하면 stack smashing detected라는 오류가 발생 $ gcc -o canary canary.c $ ./canary HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH *** stack smashing detected ***: terminated Aborted == prologue == 0x000000000..

스택 오버플로우는 스택영역 확장이 너무 큰 경우 스택 버퍼 오버플로우는 스택에 존재하는 버퍼가 오버플로우 되는 것 Memory leak - 문자열의 끝(스택에서 문자열의 맨 끝)에 널바이트가 없으면 하나의 문자열로 인식되어 printf 등에서 쭉 출력될 수 있음 - c계열의 언어에서는 널바이트(x00)가 문자열의 종료를 알림. 별도의 길이 언급이 없는 대부분의 함수는 이 널바이트를 만날 때 까지 동작을 계속하므로 주의해야 함 Return address overwrite - 함수를 호출할 때, rip(반환 주소)와 rbp를 스택에 순서대로 담는다는 것을 생각 // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #include #..
컴파일러별로 함수 호출시 사용하는 규약이 다름 x86 : 레지스터 수가 적어 스택을 통해 인자를 전달 - cdecl - stdcall - fastcall - thiscall x86-64 - System V (SYSV) - MS ABI : Windows Syscall에 사용됨 cdecl - 인자 전달에 사용한 스택을 "호출자(Caller)"가 정리함 SYSV - 인자를 레지스터에 담아 전달함 (RDI, RSI, RDX, RCX, R8, R9 순서대로 + 이후에는 스택) - Caller가 스택을 정리함 - 반환값은 RAX에 담김 - push 하나당 rsp가 8씩 감소함을 생각하자(esp의 두배) - callee가 종료되면 leave 명령어고 rbp를 꺼내고 ret 명령어로 rip를 되돌림 - 이후 calle..
그동안 개념을 공부한다고 pwntools 없이 했었는데, 이참에 이 모듈에는 익숙해져보기로 함 1. process - 로컬 바이너리를 대상으로 익스플로잇을 수행할 떄 - p = process('프로세스명') 2. remote - 원격 서버를 대상으로 수행할 때 - p = remote('사이트', '포트') 3. send/recv - 프로세스에 데이터 전송 및 받기 - p.send() / p.sendline() / p.sendlineafter('문자열', 'aa') - 문자열이 출력된 후 aa\n를 입력 - data = p.recv(128) -- 받은 데이터를 최대 128byte 만큼 data에 저장 - data = p.recvn(128) -- 데이터를 딱 128byte 만큼 받음. 받을때까지 대기 - d..
ORW shellcode? - OPEN / READ / WRITE 세 함수를 사용하여 파일을 읽고 화면에 출력하는 쉘코드 - execve 등의 쉘코드가 사용 불가능 할 때, 파일을 읽는 작업 등을 위해 사용 - 원리는 다음과 같음 1) open 함수로 파일을 연다 2) 생성된 fd를 read 함수에 넘기고 읽은 후에 스택에 결과를 저장 3) 스택에서 정보를 읽어 stdout 등에 출력 각각의 syscall은 다음과 같이 구성됨 1. open - rax : 0x02 (syscall_open) - rdi : 읽을 파일명이 담긴 주소 - rsi : flag(read_only, write_only 등) - rdx : mode(read 함수에서 mode는 의미가 없음) 2. read - rax : 0x00 (sy..
1. FSB - 포맷 스트링 버그 - printf 혹은 sprintf 와 같이 '포맷 스트링'을 사용하는 함수에서 발생할 수 있는 버그 - 사용자의 입력을 받아 출력할 때, 사용자가 일반적인 스트링이 아닌, '포맷 스트링'을 입력했다면? - %x와 %s같은 값을 입력하는 경우 의도되지 않은 스트링이 출력될 것. 주로 사용되는 포맷 스트링 - %x : 16진수 - %p : 포인터 - %n : 작성된 총 바이트 수 - %s : 문자열 - %d : 10진수 등등 예시 - fgets(buf, sizeof(buf), stdin) 이후 printf(buf)를 하는 경우 - buf(buf의 내용을 가리키는 주소) / sizeof(buf) / stdin / buf의 내용 과 같이 스택이 구성됨 - 여기서 사용자가 bu..
초심으로 돌아가서 처음부터 다시 공부하자. 1. BOF, 버퍼 오버플로우 라고 불리우는 메모리 관련 취약점. - 일반적으로 스택, 힙에 발생하는 취약점으로, 버퍼가 허용할 수 있는 양을 초과할 때 발생하는 취약점 - 각각을 스택 오버플로우, 힙 오버플로우 라고 부름 - 버퍼에 입력제한이나 검증등의 방지책이 없을 때 ret 영역을 덮어씌우는 공격이 가능 - *sfp는 스택 프레임 포인터로 쉽게 ebp 값이 저장되는 영역을 의미 스택 오버플로우는 주로 입력 길이에 대한 검증을 정확히 수행하지 않을 때 발생. 길이를 명시하는 함수를 쓰더라도, 버퍼와 길이간 검증은 필수. 2. OOB, 아웃 오브 바운더리 라고 불리우는 메모리 관련 취약점. - 버퍼 범위 바깥의 인덱스에 접근할 때 발생 - 에러로도 있다. 동일..