[P4C] 우리집에 GDB 있는데… 메모리 보고갈래? (3) 정리
2021. 3. 13. 02:09
Hacking/Pwnable
DEBUGGING (IDA, GDB 사용) 우리는 이미 tomato.c 소스가 있지만, 보통 소스는 잘 주지 않기에 없다는 가정하에 디버깅을 해보겠다. IDA로 취약점 발견 헥스레이라는 강력한 기능을 제공하는 디스어셈블러이다. 헥스레이는 바이너리를 디컴파일해서 원본 코드와 흡사한 소스를 떨궈준다. F5 단축키를 누르면 다음과 같이 디컴파일한 소스(pseudocode)가 나온다. IDA에서 8번째 라인을 보면, buffer overflow 취약점이 나는 것을 쉽게 확인할 수 있다. strcpy를 할 때 복사 버퍼의 길이를 검증하지 않기에 버퍼 크기인 10보다 더 넣어줘서 bof를 일으켜 num의 값을 1로 바꾸면 될 것으로 보인다. (strcpy는 버퍼 오버플로우 취약점이 발생할 가능성이 농후하기 때문에 ..
[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이다! 유저 영역, 커널 영역 시스템 운영..
[HackCTF] Basic_Bof - 내 버퍼가 흘러넘친다!!!
2021. 3. 11. 15:36
Wargame/HackCTF
1. 문제 의도 파악 지금 read와 gets 함수로 입력을 두 번 받고 있다. 그리고 gets 함수의 경우, 입력값 검증을 하지 않기에 buffer 크기인 20보다 더 크게 넣어 return address를 바꿀 수 있을 것이다. 그래서 쉘 코드를 어디에 넣을까 생각하다가, read 함수로 입력을 받는 name에 쉘 코드를 삽입하고 버퍼 s에 더미값과 name의 시작 주소를 넣어 쉘코드를 실행해보려 한다. 2. offset 구하기 name의 경우 50byte만큼 입력을 받는다. 따라서 쉘코드를 넣고 그 앞 뒤에 nop을 채워주면 될 것으로 생각된다. 그런데, 이때 name은 bss 영역이기 때문에 ASLR의 영향을 받지 않는다. 따라서 nop을 주지 않고, 쉘코드만 채워도 된다는 결론이 나온다. 그리고..
[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를 붙인다면..
[FTZ] 해커스쿨 FTZ training 6~10
2021. 3. 10. 22:34
Wargame/Hackerschool FTZ
Trainer6 ※ 패스워드 파일 분석 방법 root : x : 0 : 0 : Admin : /root : /bin/bash 1 2 3 4 5 6 7 1. 로그인할 때 사용되는 아이디 2. 패스워드 - 사용자들의 패스워드만 모아 새로운 파일을 만듦 (/etc/shadow) 3. 컴퓨터에 입력되는 사용자 아이디 (컴퓨터 입장에서의 root라는 의미) 4. 해당 사용자가 속해있는 그룹 5. 사용자의 이름 6. 로그인에 성공 했을 때 기본으로 위치하게 되는 디렉터리 7. 처음 로그인 했을 때 실행되게 할 프로그램 (로그인 했을 때 쉘이 실행되는 것) Trainer7 ※ 리눅스 환경에서 압축하고, 해제하는 방법 (tar, gzip) tar는 사실 압축 프로그램이 아님 압축을 하면 용량이 줄어야 하는데 늘기 때문..
[FTZ] 해커스쿨 FTZ training 1~5
2021. 3. 10. 20:55
Wargame/Hackerschool FTZ
Trainer1 리눅스를 처음 접속하면 "프롬프트"가 나타나며 이것은 서버에 성공적으로 로그인 되었다는 것을 의미한다. [trainer1@ftz trainer1]$ 접속ID 서버 현재위치 ls : 리스트 출력 ls -l : 파일&디렉터리 파일 성격 Permission 용량 생성 날짜 이름 -rw-rw-r-- 1 trainer1 trainer1 779 9월 24 18:37 start.txt drwxr-xr-x 2 trainer2 trainer2 1024 9월 24 11:52 tmp 파일/디렉터리 구분 : 앞부분이 -이면 파일, d이면 디렉터리(directory) ls -a : 숨겨진파일 리스트 출력 (숨겨진 파일은 앞자리에 "."이 들어감) ls -al : 숨겨진파일&디렉터리 리스트 출력 Trainer2 ..