Lab1. Buffer Overflows | Báo cáo thực hành Môn An toàn thông tin Trường đại học sư phạm kỹ thuật TP. Hồ Chí Minh
A generic buffer overflow occurs when a buffer that has been allocated a specific storage space has more data copied to it than it can handle. Buffer overflow steps: 1. Find the presense and location of buffer overflow vulnerability; 2. Write mote data into the buffer than it can handle; 3. Overwites the return address of a function; 4. Changes the execution flow to the hacker code. Tài liệu giúp bạn tham khảo, ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!
Môn: An toàn thông tin (INSE330380)
Trường: Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh
Thông tin:
Tác giả:
Preview text:
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUÂT TP.HỒ CH MINH
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI THỰC HÀNH(LAB)
Môn học: AN TOÀN THÔNG TIN
Mã lớp học phần: INSE330380_22_1_08
GVHD:TS. Huỳnh Nguyễn Chính
Sinh viên thực hiện: Mai Bảo Huy - 20110649
TP Hồ Chí Minh, tháng 09 năm 2022 Lab1. Buffer Overflows
A generic buffer overflow occurs when a buffer that has been allocated a
specific storage space has more data copied to it than it can handle. Buffer overflow steps:
1. Find the presense and location of buffer overflow vulnerability
2. Write mote data into the buffer than it can handle
3. Overwites the return address of a function
4. Changes the execution flow to the hacker code Submission:
You will compose a lab report that documents each step you take, including
screenshots to illustrate the effects of commands you type, and describing your
observations. Simply attaching code without any explanation will not receive credits Time duration: 1 week
Bước 0. Chuẩn bị các công cụ và tài liệu liên quan.(Preparation) - Ubuntu 16.04 (32-bit)
- Source code: stack.c, exploit.c/exploit.py
Bước 1: Thực hiện tắt địa chỉ Randomization (Disable address randomization)
- Việc tắt chức năng này để có ta thể thực hiện bài lab. Ta sử dụng câu lệnh:
$sudo sysctl –w kernel.randomize_va_space=0
Bước 2: Xác định địa chỉ trả về thích hợp để chèn đoạn code thực thi
(Finding the address of the inject code)
- Trước tiên (2.1), ta tiến hành tạo file debug stack_dbg, (Bỏ qua
StackGuard và cho phép stack có thể executable),
$gcc –z execstack –fno-stack-protector –g –o stack_dbg stack.c
- Với yêu cầu file stack.c phải được kiểm tra trước thử xem đã có trong máy
chưa ( bằng dòng lệnh $ ls)
- (2.2) Chúng ta tạo một file “badfile”, được thực hiện bằng lệnh: $touch badfile
- (2.3) Ta tiến hành vào chương trình debug cho file stack.c, bằng cách khởi
động gdb và set file cần debug ngay. Ta sử dụng câu lệnh: $gdb stack_dbg
- (2.3) Ta thực hiện đặt breakpoint tại hàm bof (tên hàm trong file stack.c) :
Ta thực hiện bằng dòng lệnh: (gdb)b bof
- (2.3) Ta tiến hành kích hoạt chương trình chạy đến breakpoint: (gdb)run
- (2.4) Tiếp theo ta tiến hành xác định địa chỉ thanh ghi ebp: (gdb)p $ebp
Ta xác định được địa chỉ thanh ghi ebp = (void *) 0xbfffeb38
- (2.5) Tiếp theo ta tiến hành xác định địa chỉ biến buffer: (gdb)p &buffer
Ta xác định được địa chỉ biến buffer = (char (*)[24]) 0xbfffeae8
- (2.6) Ta tính khoảng cách giữa hai từ ebp và buffer, bằng câu lệnh:
(gdb) p/d 0xbfffeb38 – 0xbfffeae18
=> Từ các dữ liệu trên ta có thể tính được địa chỉ trả về của hàm bof:
Return address = ebp + (32 + 4) = ebp + 36
(Ta cộng thêm 4 vì ta bỏ qua 4 byte (32 bit) vùng Return address)
Bước 3: Chỉnh sửa file exploit.c (Edit exploit.c)
- Ta thay đổi địa chỉ trả về bằng một địa chỉ mới *((long *) (buffer + )) = 36 0xbfffeb38 + ; 0x80
- Từ bước 2 ở trên ta có công thức tính địa chỉ trả về mã độc là : ebp +
[randomizeNum], trong đó kết quả phải không chứa số 0 do câu lệnh copy khi gặp
ký tự \0 sẽ lập tức kết thúc chương trình.
Ta tiến hành tính xem có chứa số 0 hay không:
ebp + 0x80 = 0xbfffeb38 + 0x80 = bfffeb38 ( Không có số 0 )
- Dùng hàm memcpy để copy sizeof(shellcode) kí tự từ mảng shellcode đến địa chỉ
(buffer + sizeof(buffer) – sizeof(shellcode)) phía sau của vùng Buffer bằng dòng code:
Memcpy(buffer + sizeof(buffer) – sizeof(shellcode), shellcode, sizeof(shellcode));
Bước 4: Thực thi (Execute):
- (4.1) Ta tiến hành tạo liên kết giữa /bin/zsh và /bin/sh để có thể compile một
số câu lệnh, tránh bị chặn bằng cách thực thi dòng lệnh sau: $ sudo ln -sf /bin/zsh /bin/sh
- (4.1)Tiếp đến, ta compile file stack.c và cho phép stack executable đồng thời bỏ
qua StackGuard và thay đổi giá chị của biến DBUF_SIZE trong file stack.c thành
100 , chúng ta thực hiện bằng dòng lệnh: $ gcc -DBUF_SIZE=
100 -o stack -z execstack -fno-stack- protector stack.c
- (4.1)Đến đây, chúng ta sẽ đặt quyền sỡ hữu file stack.c sang cho root, bằng câu lệnh:$ sudo chown root stack
-(4.1) Tiếp tục, chúng ta thay đổi file stack thành chương trình đặc quyền với câu
lệnh: $ sudo chmod 4755 stack
+ Để kiểm tra xem chương trình đã có đặc quyền cho file stack chưa ta thực
hiện câu lệnh: $ls -l stack
- Để thực hiện tiếp chương trình từ bước hai chúng ta sự dụng lệnh “q” hoặc”quit”
để thoát chương trình và sau đó thực hiện tiếp các bước từ (4.1) để có kết quả như hình bên trên.
- (4.2) Chúng ta tiến hành biên dịch(compile) file exploit.c bằng câu lệnh như sau: $ gcc -o exploit exploit.c
- (4.2) Ta bắt đầu thực thi file exploit và stack sau khi compile bằng lệnh:
$./exploit // create the badfile
$./stack // launch the attack by running the vulnerable program
# <---- You’ve got a root shell!(sau khi thực thi 2 file trên)
ta xác định được quyền của root qua dấu “#”
Bước 5: Defeating Address Randomization (ASLR - Address space layout randomization)
( Ta sẽ thực thi tiếp tục bằng cách bật Address Randomization bằng câu lệnh)
$sudo sysctl –w kernel.randomize_va_space=2
Bước 6. Turn on the StackGuard Protection
You should compile the program without the -fno-stack-protector option
Bước 7: Turn on the Non-executable Stack Protection
We recompile our vulnerable program using the noexecstack option
- (7.1) Ta sẽ thực hiện lab trên file exploit.py (Lab with exploit.py)
+ Ta sẽ thay đổi giá trị biến ret và offset trong file exploit.py
ret = 0xbfffeb38 + 0x80 ///khac 0 offset = 36
Cuối cùng ta sẽ tiến hành chạy file exploit.py để tạo nội dung cho file badfile