[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (2) 정리
2021. 3. 12. 19:03
Hacking/Pwnable
tomato.c 파일은 strcpy를 할 때 복사 버퍼의 길이를 검증하지 않기에 버퍼 크기인 10보다 더 넣어줘서 bof를 일으켜 num의 값을 1로 바꾸면 될 것으로 보인다. 그리고 실습 환경을 최대한 똑같이 해주기 위해 다음과 같이 몇 가지 보호 기법들을 해제해서 컴파일 해주었다. gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -fno-pie -o tomato tomato.c -fno-stack-protector 옵션을 포함하는 이유 gcc가 스택을 보호하기 위해 ‘canary’라는 것을 삽입한다. 함수 내에서 사용하는 스택 프레임과 return address 사이에 'canary'를 넣는 것이다. 그리고 Buffer Overflow가 발생해..
[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? 정리
2021. 3. 11. 21:55
Hacking/Pwnable
메모리 주소 보통 노트북은 4GB의 램을 쓰는데, 4GB를 Byte 단위로 변환하면 2^32Byte이다. 그리고 1Byte는 주소공간 한 개의 크기이다. 즉, 4GB는 2^32개의 주소를 가질 수 있다. 또 한편, 1 bit는 0 또는 1의 값만 가질 수 있기에 32bit는 2^32만큼의 숫자를 표현할 수 있다. 32 bit 라는 것은 2^32개의 주소를 가지고 있다라는 뜻이다. 따라서 32bit 운영체제는 수 표현을 최대 2^32까지 밖에 못 하기 때문에, 8GB나 16GB의 램을 가지고 있다고 하더라도 접근을 할 수가 없다. 0000…0000(32개) 부터 1111….1111(32개) 까지를 보기 편하게 16진수로 변환하면? 00000000 ~ FFFFFFFF이다! 유저 영역, 커널 영역 시스템 운영..
[Pwnable] ASLR
2021. 3. 11. 14:52
Hacking/Pwnable
Address Space Layout Randomization(ASLR)은 라이브러리, 힙, 스택 영역 등의 주소를 바이너리가 실행될 때마다 랜덤하게 바꿔 RTL과 같이 정해진 주소를 이용한 공격을 막기 위한 보호 기법이다. NX bit는 바이너리의 컴파일 옵션에 따라 적용 여부가 결정되었던 것과 달리, ASLR은 서버의 설정 파일에 의해 보호 기법의 적용이 결정된다. Ubuntu 16.04에서는 /proc/sys/kernel/randomize_va_space 파일의 값을 확인하면 서버의 ASLR 설정 여부를 알 수 있다. 설정 파일의 값으로는 0, 1, 2가 있습니다. 각 값은 아래와 같은 의미를 갖는다. 0 : ASLR을 적용하지 않음 1 : 스택, 힙 메모리를 랜덤화 2 : 스택, 힙, 라이브러리 ..
[Pwnable ] NOP Sled 실습
2021. 3. 11. 14:39
Hacking/Pwnable
NOP은 "No OPeration"의 약자로, 명령어 중의 하나다. NOP은 xchg eax, eax와 같이 프로그램의 실행에 영향을 주지 않는 명령어이기 때문에, 프로그램이 실행 중에 NOP 명령어를 만나면 다음 명령어로 넘어가는 것과 같은 효과를 준다. x86 아키텍처의 NOP 명령어 바이트코드는 0x90이다. NOP Sled, 혹은 NOP Slide는 주로 셸코드의 주소를 정확히 알아내기 힘들 경우 큰 메모리를 확보하여 셸코드 주소의 오차 범위를 크게 만들 때 사용한다. 예를 들어, 0x100 주소에 셸코드가 저장되어 있다고 가정해 보자. 만약 NOP Sled가 없다면 정확히 0x100 주소로 실행 흐름을 바꿔야 셸코드가 실행된다. 하지만 셸코드 앞에 0x10000바이트의 NOP Sled를 붙인다면..
[Pwnable] RTL 실습
2021. 3. 7. 18:29
Hacking/Pwnable
Return To Libc(RTL)은 리턴 주소를 라이브러리 내에 존재하는 함수의 주소로 바꿔 NX bit를 우회하는 공격 기법이다. 리눅스 익스플로잇의 최종 목표는 셸 바이너리를 실행하는 것이다. libc.so.6 라이브러리에는 execve , execlp , execl , execvp , system , popen 등 프로그램을 실행할 수 있는 다양한 함수들이 존재한다. 이 중 system 함수를 이용해 "/bin/sh" 문자열의 주소를 system 함수의 인자로 넘겨준 후 호출하면 /bin/sh 바이너리가 실행된다. example1 예제에 NX bit가 추가된 example1_nx를 이용해 RTL을 실습해 보도록 하겠다. 취약점은 이전과 동일하지만 example1_nx에는 NX bit가 적용되어 스..
[Pwnable] NX bit
2021. 3. 7. 16:06
Hacking/Pwnable
앞에서는 프로그램의 취약점을 이용해 실행 흐름을 조작한 뒤 스택 영역에 저장된 셸코드를 실행하였다. 하지만 일반적인 프로그램에서의 스택 메모리는 코드를 실행하는 용도로 사용되는 것이 아니라, 일시적으로 데이터를 읽고 쓰는 데 사용되기 때문에 실행 권한이 있을 필요가 없다. 이러한 이유로 프로그램의 공격을 어렵게 하기 위해, 메모리에 쓰기 권한과 실행 권한을 동시에 부여하지 않는 No-eXecute bit(NX bit)가 등장하였다. //gcc -o example2_x example2.c -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -m32 //gcc -o example2_nx example2.c -fno-stack-protector -m..
[Pwnable ] Return Address Overwrite 실습
2021. 3. 1. 14:03
Hacking/Pwnable
스택 버퍼 오버플로우 취약점이 있을 때에는 주로 스택의 리턴 주소를 덮는 공격을 한다. 리턴 주소는 함수가 끝나고 돌아갈 이전 함수의 주소로, 스택에 저장된 리턴 주소를 다른 값으로 바꾸면 실행 흐름을 조작할 수 있다. 다음은 스택 버퍼 오버플로우를 실습할 example.c이다. example1.c에서는 프로그램의 argv[1]을 vuln 함수의 인자로 전달한다. vuln 함수에서는 src 버퍼를 buf 버퍼에 strcpy 함수를 이용해 복사한다. strcpy 함수는 피복사 버퍼에 대한 길이 검증이 없기 때문에, 프로그램의 첫 번째 인자에 buf 배열의 크기보다 긴 문자열을 넣으면 스택 버퍼 오버플로우가 발생한다. ※ 그럼 지금부터 vuln 함수의 인자를 전달할 때 buf 버퍼보다 크기가 큰 배열을 전달..
[Pwnable] ELF 동적 분석
2021. 3. 1. 01:39
Hacking/Pwnable
ELF 동적 분석 바이너리를 분석할 때, 바이너리가 실행되며 변화하는 상태를 관찰하기 위해 동적 디버깅이 필요한 경우가 있다. 때문에 리눅스의 실행 파일인 ELF 파일을 동적으로 디버깅하는 방법에 대해 알아보도록 하겠다. 여기선 가장 유명한 ELF 디버거인 gdb(GNU Debugger)를 사용하여 ELF 바이너리를 동적 디버깅하는 방법에 대해 알아보겠다. gdb의 디스어셈블리 문법에는 AT&T와 intel 두 종류가 있다. 이 중 널리 쓰이는 디스어셈블리 문법은 intel 이다. gdb 기본 설정에서의 디스어셈블리 문법은 AT&T이기 때문에, 디버깅 실습을 하기 전에 gdb의 디스어셈블리 문법을 intel로 바꾸어 주어야 한다. .gdbinit는 gdb를 시작할 때 자동적으로 실행할 gdb 명령어들을 ..