System
[HackCTF] 내 버퍼가 흘러넘친다!!! (prob1)
check - 32bit - NX 적용 X Analyze pseudo code - 간단하게 main 함수에서 해결할 수 있는 문제이다 - name 변수는 IDA를 통해 확인하니 bss 영역에 저장되어있다. name은 전역변수(public)으로 선언되어 따로 초기화되어있지는 않은 값으로 bss 영역에 저장되어 있다. >> bss영역과 데이터 영역의 차이는 shinluckyarchive.tistory.com/159 이 블로그에서 잘 설명해주셨다! - read 함수를 이용해 name 변수의 위치(bss영역)에 쉘코드를 저장하고 gets 함수에서의 값을 입력받으면서 쉘 코드를 저장한 영역을 리턴주소로 덮어쓰면서 쉘 코드를 실행시키도록 할 수 있을 것 같다! Exploit from pwn import * #p =..
[HackCTF] offset
check - 32bit - Full RELRO - PIE Analyze Pseudo Code (IDA) - select_func 함수에서 src는 main함수에서 s를 받는다. - select_func에서 strncpy함수를 이용하여 dest에 src의 내용을 0x1F(31byte)만큼 복사한다. - one, two 함수는 단순하게 문자열을 출력하는 함수이다. - select_func에서는 포인터 v3에 함수 two를 리턴했다. select_func이 종료될 때 v3이 리턴된다. 즉, v3이 가리키는 함수가 리턴되므로 이 값을 조작하면 원하는 함수를 리턴할 수 있을 것 같다. - 그리고 dest와 v3 사이의 거리는 0x2A-0xC (=42-12) = 30byte이다. 따라서, src에서 dest로 복..
[HackCTF] basic_bof2
checksec - 32bit - Partial RELRO Analyze pseudo code - 스택 버퍼에 문자열 s에 fgets 함수를 이용해 133byte만큼 표준입력을 통해 입력받도록 한다. 하지만 이 때는 133
[HackCTF] ROP
checksec - 32bit - No Canary - NX +) 라이브러리 파일(libc.so.6)이 따로 있으므로 이 점 주의 Analyze pseudo code vulnerable_function 함수에서 buf를 0x88byte만큼 할당하고 read함수를 통해 0x100 byte 읽으면서 stack buffer overflow가 발생한다. write함수의 plt와 got 값을 이용해 libc를 leak하도록 한다 >> 가젯을 찾아야한다. gadgets read함수와 write함수 모두 인자를 3개씩 가지는 함수이므로 pppr 가젯을 찾아야한다. pop esi ; pop edi ; pop ebp ; ret ; 가젯 주소 = 0x8048509 pop ebp ; ret ; 가젯 주소 = 0x804850..
[Protection Tech.] Canaries(카나리), SSP
Canaries (Canary word) 버퍼 오버플로우를 모니터하기 위해 버퍼와 제어 데이터(SFP) 사이에 설정된 값; 버퍼 오버플로우가 발생하면 canary의 값이 손상되고 canaries 데이터의 검증에 실패해 오버플로우에 대한 경고가 출력되고 손상된 데이터를 무효화 처리한다. 버퍼 Canary SFP △ 카나리가 적용된 경우 스택 구조 Canaries의 종류 ➰ Terminator Canaries canary 값을 문자열의 끝을 나타내는 문자들-NULL(0x00), CR(0x0d), LF(0x0a) EOF(0xff)-을 이용해 생성한다. 공격자가 이 canaries를 우회하기 위해서는 return address를 쓰기 전에 null 문자를 써야한다. null 문자는 overflow를 방지하게 한..
[HackCTF] bof_basic
checksec - 32bit - Partial RELRO - NX Analyze Pseudo Code (IDA) 실행 - 사용자로부터 문자열(buf) s의 값을 fgets함수를 통해 입력받도록 되어있다. - s와 v5 사이의 거리는 0x34 - 0xC = 52-12 = 40byte - 바꿔야 될 값이 v5이고 s와 v5 사이의 거리가 40byte이기 때문에 fgets함수에서 45byte로 제한했음에도 bof 공격이 가능해진다. - v5가 0xdeadbeef일 때 system("/bin/sh") 이 실행되니까 "A"*40 + 0xdeadbeef 의 꼴로 payload를 작성하면 될 것이다. "A"*40 + "BBBB"를 입력했더니 v5의 주소가 "BBBB"로 덮인 것을 확인할 수 있다. Exploit f..
리눅스 디렉터리(Directory)
디렉터리(Directory) 윈도우에서의 폴더로 생각하면 이해가 쉽다. 리눅스는 최상위 디렉터리인 루트(/)를 기준으로 그 하위 디렉터리에 또다른 다수의 디렉터리가 존재하는 트리 구조의 계층적인 파일구조를 가지고 있다. 리눅스에서 디스크 파티션을 나눌 때 루트 파티션을 할당해주면 루트 디렉터리의 하위 디렉터리들이 종속된다. / 최상위 디렉터리로, 루트 디렉터리라고 한다. /root 시스템 관리자 root의 홈 디렉터리이다. /bin binary의 약자로, 주로 실행 파일들이 들어있는 디렉터리이다. 터미널에서 사용하는 명령어들이 들어있는 디렉터리로 PATH가 설정되어 있다. /sbin system binary의 약자로, 주로 시스템 관리에 대한 명령어들이 들어있는 디렉터리이다. /boot 부팅 이미지 파일..
부트 매니저 - LILO, GRUB
부트 매니저(Boot Manager) = 부트 로더(Boot Loader) 부팅을 도와주는 역할을 하는 프로그램; 컴퓨터를 처음 시작했을 때 가장 먼저 실행되는 소프트웨어 프로그램이다. 한 컴퓨터에 다양한 운영체제가 설치되어 있을 경우에 선택하여 부팅할 수 있도록 한다. 하드 디스크의 맨 앞쪽 영역인 MBR(Master Boot Record)에 설치된다. **MBR: 부트 섹터(Boot Sector)/파티션 섹터(Partition Secotr); 디스크의 첫 번째(0번) 섹터이고, 크기는 512byte이다. 이 영역에 부트 로더 프로그램과 파티션 정보를 기록한다. 이 정보들을 통해 운영체제가 어디에 위치해 있는지 파악하고 선택한 운영체제를 주메모리 또는 RAM에 부팅한다. 리눅스에서 사용하느 가장 대표적..
LVM
LVM = Logical Volume Manager - 여러 개의 하드 디스크를 하나의 디스크처럼 만들거나, 2개의 하드 디스크를 3개의 디스크인 것처럼 만들 수 있다. - 사용 중인 파티션의 크기를 줄이거나 늘릴 수 있다. → 리눅스를 설치하거나 하드 디스크를 추가할 때 설정한 공간의 크기는 고정이 되어 변경이나 용량 증설이 어려운데, LVM이 이 문제점을 해결한다. 물리적 볼륨(PV; Physical Volume) 실제 디스크에 물리적으로 분할한 파티션이다. LVM에서는 물리적 볼륨을 하나의 구성원으로 받아들인다. 예) /dev/sdb1, /dev/sdc1 볼륨 그룹(VG; Volume Group) PV들이 보여 생성하는 덩어리 = PE가 모여 생성되는 하나의 큰 덩어리이다. 논리적 볼륨(LV; Lo..
RAID
RAID = Redundant Array of Independent/Inexpensive = 여러 개의 하드디스크를 하나의 디스크처럼 사용해 동일한 데이터를 다른 위치에 중복해서 저장하는 방법 = 디스크 어레이(Disk Array) - 운영체제는 하나의 RAID (데이터가 저장된 디스크의 묶음이라고 생각)는 논리적으로 하나의 디스크로 인식해 처리한다. - 초기 목적: 저용량 하드 디스크를 하나의 디스크로 확장해 사용 - 현재 목적: 백업 + 안정적인 데이터의 보존 및 유지, 속도 향상 등 - 하드웨어 RAID: 하드웨어 제조업체에서 여러 개의 하드디스크를 연결한 장비를 만들어 공급하는 RAID로, 안정적이고 성능이 좋은 편이다. ▶▶ "핫 스왑(Hot Swap) 베이(Bay)" 기능; 전원이 켜져있는 상..