
[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가 적용되어 스..

[HackCTF] Basic_Bof #1
2021. 3. 4. 14:03
Wargame/HackCTF
1. 문제 의도 파악 우선 v5 값이 0xDEADBEEF일 때 쉘을 획득할 수 있으니 v5 값을 변경하면 된다. 어떻게 값을 변경할 수 있을까 찬찬히 살펴보니 다음과 같은 결론이 나왔다. 우선 gets 함수로 배열 s에 입력을 받고 있는데, 배열의 크기인 40보다 더 큰 45 바이트로 입력을 받고 있다. 따라서 buffer overflow 공격을 통해 배열 s를 넘치게 해서 v5 값을 변경할 수 있을 것이다. 2. offset 구하기 디버깅을 하지 않고 ida를 통해 간단하게 offset을 얻었다. 배열 s의 주소가 ebp-52이고 v5의 주소가 ebp-12이니, offset은 40이다. 따라서 40만큼을 dummy 값으로 채우고 그 이후부터 0xDEADBEEF(변경해야 할 값)로 채우면 된다. payl..

[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 명령어들을 ..

[Pwnable] Dreamhack - Memory Corruption - C (I)
2021. 2. 28. 18:46
Hacking/Pwnable
Buffer Overflow C언어에서 버퍼란 지정된 크기의 메모리 공간이라는 뜻이다. 버퍼 오버플로우 취약점은 버퍼가 허용할 수 있는 양의 데이터보다 더 많은 값이 저장되어 버퍼가 넘치는 취약점을 뜻한다. 일반적으로 버퍼 오버플로우는 발생하는 위치에 따라 스택 버퍼 오버플로우, 힙 오버플로우와 같이 나눠서 부른다. 버퍼 오버플로우는 인접한 메모리를 오염시키는 취약점이기 때문에 어떤 메모리를 오염시킬 수 있는지에 따라 공격 방법이 달라지기 때문이다. 그중 스택 버퍼 오버플로우는 지역 변수가 할당되는 스택 메모리에서 오버플로우가 발생하는 경우이다. 스택 버퍼 오버플로우 // stack-1.c #include #include int main(void) { char buf[16]; gets(buf); prin..

[Pwnable] pwndbg 주요 사용법
2021. 2. 27. 12:55
Hacking/Pwnable
GDB GDB(GNU debugger)는 GNU 소프트웨어 시스템을 위한 표준 debugger이다. 실행 방법 gdb [프로그램명] 종료 방법 q (quit_ Ctrl + d 소스 보기 ( gdb 실행 시 소스 폴더에서 구동해야 가능함. ) l : main 함수를 기점으로 소스 출력 l 10 : 10행을 기준으로 출력 l func : func 함수의 소스를 출력 브레이크 포인트 ( 프로그램을 브레이크 포인트에 멈춰서 그 때의 상황을 파악하면서 확인할 때 사용 ) b func : func 함수의 시작 부분에 브레이크 포인트 설정 b 10 : 10행에 브레이크 포인트 설정 프로그램 실행, 종료 ( run kill ) r : 프로그램 수행( 재시작 ) k : 프로그램 수행 종료 역추적 하기 bt : 오류가 발..