목록INTERLUDE (111)
Information Security
비밀글

ASLR이 걸린 환경에서 system 함수 사용 -> 프로세스에서 libc가 매핑된 주소 찾기 -> 그 주소로부터 system 함수의 오프셋을 이용해 함수의 주소 계산 Return Oriented Programming리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법 return to library, return to dl-resolve, GOT overwrite 등의 페이로드를 구성 가능 ROP 페이로드는 리턴 가젯으로 구성됨 ROP chain: ret 단위로 여러 코드가 연쇄적으로 실행되는 모습 GOT Overwrite: 어떤 함수의 GOT 엔트리를 덮고, 해당 함수를 재호출하여 원하는 코드를 실행시키는 공격 기법 [wargame] rop스택 카나리, NX을 적용하여 컴파일한 바이너리를, ROP를..

Return To Library NX - 공격자가 버퍼에 주입한 셸 코드 실행이 어려워짐 - 스택 버퍼 오버플로우 취약점으로 반환 주소를 덮는 것 가능 -> 실행 권한이 남아 있는 코드 영역으로 반환 주소를 덮는 공격 기법 메모리 영역은 바이너리의 코드 영역과 바이너리가 참조하는 라이브러리의 코드 영역 libc에는 system, execve등 프로세스의 실행과 관련된 함수들이 구현되어 있음 Return To Libc libc의 함수들로 NX를 우회하고 셸을 획득하는 공격 기법 Return To Library 다른 라이브러리도 공격에 활용 [wargame] Description // Name: rtl.c // Compile: gcc -o rtl rtl.c -fno-PIE -no-pie #include #i..

라이브러리 - 컴퓨터 시스템에서, 프로그램들이 함수나, 변수를 공유해서 사용할 수 있게 함 - 같은 함수를 반복적으로 정의해야 하는 수고를 덜 수 있어서 코드 개발의 효율이 높아진다는 장점 링크(Link) - 심볼과 관련된 정보들을 찾아서 최종 실행 파일에 기록하는 것 - 컴파일의 마지막 단계 gcc는 소스 코드를 컴파일할 때 표준 라이브러리의 라이브러리 파일들을 모두 탐색 $ ld --verbose | grep SEARCH_DIR | tr -s ' ;' '\n' 표준 라이브러리의 경로 확인 => 링크를 거치고 나면 프로그램에서 puts를 호출할 때, puts의 정의가 있는 libc에서 puts의 코드를 찾고, 해당 코드를 실행하게 됨 정적 컴파일동적 컴파일 $ gcc -o static hello-wor..
NX(No-eXecute) 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법 - 메모리 영역에 대해 쓰기 권한과 실행 권한이 함께 있으면 시스템이 취약해지기 때문 CPU NX 지원 시: 컴파일러 옵션을 통해 바이너리에 NX 적용 -> NX가 적용된 바이너리는 실행될 때 각 메모리 영역에 필요한 권한만을 부여 메모리 맵 확인 pwndbg> vmmap NX가 적용된 바이너리: 코드 영역 외에 실행 권한이 없음 NX가 적용되지 않은 바이너리: 스택 영역([stack])에 실행 권한이 존재하여 rwx 권한을 가지고 있음 ASLR( Address Space Layout Randomization) 바이너리가 실행될 때마다 스택, 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 ..

스택 카나리(Stack Canary) 함수의 프롤로그에서 스택 버퍼와 반환 주소 사이에 임의의 값을 삽입하고, 함수의 에필로그에서 해당 값의 변조를 확인하는 보호 기법 예제 코드 // Name: canary.c #include int main() { char buf[8]; read(0, buf, 32); return 0; } 반환주소가 덮여서 Segmentation fault 발생 한 번 더 컴파일 시 stack smashing detected, Aborted 에러 발생 -> 스택 오버플로우가 발생하여 프로세스 강제 종료 의미 어셈블이어 분석 시 변경 사항 추가된 프롤로그의 코드에 중단점 설정 후 바이너리 실행 fs:0x28의 데이터를 읽은 후 rax에 저장 fs - 세그먼트 레지스터의 일종 - 리눅스에..

scanf에 %s 포맷 스트링 사용 x %[n]s 형태로 사용해야 함 위험 함수 - strcpy - strcat - sprintf 권장 함수(버퍼의 크기를 같이 입력) - strncpy - strncat - snprintf - fgets - memcpy 코어 파일 예제 파일 // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args..

x86-64호출 규약: SYSV 바이너리의 정보를 살펴보면, 아래와 같이 SYSV 문자열이 포함되어 있음 SYSV에서 정의한 함수 호출 규약 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달. 더 많은 인자를 사용해야 할 때는 스택을 추가로 이용 Caller에서 인자 전달에 사용된 스택 정리 함수의 반환 값은 RAX로 전달 SYSV 예제 // Name: sysv.c // Compile: gcc -fno-asynchronous-unwind-tables -masm=intel \ // -fno-omit-frame-pointer -S sysv.c -fno-pic -O0 #define ull unsigned long long ull callee(ull a1, int a2, i..