Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

Họ và tên : Nguyễn Thi Phú

MSSV : 2110600
Môn học : An toàn thông tin
GV : TS. Huỳnh Nguyên Chính
___________________________

LAB 2 : BUFFER OVERFLOW

EXERCISE : Lỗi tràn bộ đệm (Buffer overflow) xảy ra khi bộ đệm được phân bổ
một không gian lưu trữ cụ thể có nhiều dữ liệu được sao chép vào nó hơn mức nó có
thể xử lý. Mô phỏng lỗ hỏng trên bằng môi trường Ubuntu 16.04 (Ubuntu 32-bit).
* Tiến trình diễn ra lỗ hỏng tràn bộ đệm :
1. Tìm và phát hiện vị trí của lổ hỏng tràn bộ đệm.
2. Viết vô số dữ liệu vào bộ đệm đến mức nó không thể chứa được.
3. Thay đổi địa chỉ trả về của một hàm.
4. Đưa mã độc của hacker rồi tiến hành tấn công.
* Các bước thực hành :

Bước 0 : Chuẩn bị môi trường


− Ubuntu 16.04 (Ubuntu 32-bit).
− Các file source code : stack.c, exploit.c hay exploit.py

Bước 1 : Vô hiệu hóa địa chỉ bất kì


− Sử dụng câu lệnh $sudo sysctl –w kernel.randomize_va_space=0 để vô hiệu
hóa tính năng tạo địa chỉ ngẫu nhiên để có thể dễ hơn trong việc khai thác lỗ
hỏng tràn bộ đệm - Buffer Overflow, cụ thể để ta dễ xác định địa chỉ trả về, vị
trí shellcode của chương trình.
Bước 2 : Tìm kiếm địa chỉ và nạp code.
− Trước hết ta cần tắt các giải pháp có sẵn, bởi việc khởi tạo địa chỉ ngẫu nhiên
được lập trình để ngăn chặn, kéo dài thời gian tấn công của hackers bởi việc
địa chỉ thay đổi liên tục không cố định sẽ khiến họ khó xác định chính xac địa
chỉ cần tấn công và gắn mã độc.
− Tiếp theo ta dùng lệnh $gcc –z execstack –fno-stack-protector –g –o stack_dbg
stack.c để trình biên dịch gcc biên dịch file stack.c thành file thực thi.
− Kế tiếp, ta tạo một file rỗng bằng lệnh $touch badfile, rồi chạy công cụ debug
GNU Debugger chạy chương trình stack_dbg để nạp mã độc vào chương trình
qua lệnh $gdb stack_dbg để tiến hành dò lỗi và phân tích.

− Bước kế, ta đặt một điểm ngắt - breakpoint tại hàm bof của stack.c : (gdb)b bof.

(Hình ảnh : Ngắt một điểm tại hàm bof của file stack.c)

− Kế tiếp, ta chạy debug chương trình bằng (gdb)run.


(Hình ảnh : Người dùng bắt đầu chạy debug)

− Kế nữa, ta xem địa chỉ của thanh ghi ebp (Extended Base Pointer) - thanh ghi
con trỏ nền 32-bit qua cú pháp (gdb)p $ebp. Từ đó thấy rằng địa chỉ của thanh
ghi này là 0xbfffea28.

($1 = (void *) 0xbfffea28, xác định được địa chỉ ebp là 0xbfffea28)

− Sau khi xác định được địa chỉ thanh ghi ebp, ta xác định địa chỉ của buffer qua
cú pháp : (gdb)p &buffer.

($2 = (char (*)[24]) 0xbfffea08, xác định được địa chỉ ebp là 0xbfffea08)

− Bên cạnh việc chỉ rõ địa chỉ của buffer, ta còn phải xác định được 1 yếu tố nữa
đó là khoảng cách từ thanh ghi ebp tới buffer, bằng cách thực hiện phép trừ :
(gdb) p/d 0xbfffea28 – 0xbfffea08. Ta được kết quả bằng 32. Sau đó trả về địa
chỉ qua công thức return address = ebp + (32+4) = ebp + 36.
Bước 3 : Chỉnh sửa file exploit.c
− Ta tính được return address = ebp + 36.
− Ta sẽ chọn ngẫu nhiên một điểm X để chạy tiếp với X = ebp + alpha_X (chọn
alpha_X = 0x80 | giá trị alpha_X phải lớn hơn 0x4).
− Ta có buffer[i] = ebp + 0x80 | tổng ebp + 0x80 phải là giá trị mà giá trị đó
.không có byte nào bằng 0x00 vì strcpy sẽ dừng ghi gặp 0x00
− Từ đó ta sẽ có đoạn code: *((long *) (buffer + 36)) = 0xbfffeb58 + 0x80;
− Đặt đoạn mã độc shellcode vào cuối buffer: memcpy(buffer + sizeof(buffer) –
sizeof(shellcode), shellcode, sizeof(shellcode));
− Tiếp theo ta mở file exploit.c để chèn hai đoạn code phía trên.

Bước 4 : Thực thi


− Trước hết ta biên dịch file stack.c với tùy chọn tắt bảo vệ stack và cho phép
thực thi trên vùng nhớ stack.
− Do shell mặc định sẽ có một vài tính năng bảo mật cũng như một số hạn chế gây
khó khăn cho việc tấn công, để dễ mô phỏng ta thay đổi simbolic link từ /bin/sh
thành /bin/zsh $ sudo ln -sf /bin/zsh /bin/sh
− Biên dịch file stack.c thành file stack.exe với việc khai báo macro BUF_SIZE=24
$ gcc -o stack -z execstack -fno-stack-protector stack.c
− Dùng lệnh $ sudo chown root stack để thay đổi quyền sở hữu file stack thành
root.
− Ta thấy rằng, root có toàn quyền trên file trong khi các người dùng khác chỉ đọc
và thực thi do do ta phải thay đổi quyền trên file stack qua cú pháp : $ sudo
chmod 4755 stack
− Biên dịch file exploit.c thành file exploit.exe $ gcc -o exploit exploit.c
− Chạy file expoit $./exploit
− Chạy file stack $./stack
− Để lấy được quyền root <gõ lệnh id để lấy thông tin quyền của shell hiện
hành>

Bước 5 : Tấn công địa chỉ bất kì


− Ta bật random địa chỉ sang chế độ full randomization. Từ đó rút ra rằng, do
địa chỉ đã được tạo ngẫu nhiên nên khi gán địa chỉ vào thì bị sai, do vậy
chương trình không thể thực thi.

Bước 6 : Bật StackGuard Protection


− Yêu cầu : Nên biên dịch chương trình mà không dùng -fno-stack-protector.
− StackGuard là cơ chế để ngăn chặn lỗ hổng tràn bộ đệm - Buffer Overflow
bằng cách trước khi trả về địa chỉ của hàm trong stack, ta thêm một giá trị khác
gọi là canary value. Do đó, người dùng không thể lấy được quyền của root.

Bước 7 : Bật chế độ Non-executable Stack Protection


− Bật chế độ Non-executable Stack Protection bằng cách biên dịch lại chương
trình một lần nữa thông qua cú pháp $ gcc -o stack -fno-stack-protector -z
noexecstack stack.c
− Non-executable Stack protection là một chức năng bảo vệ chống thực thi code
từ stack. Do đó không thực thi được file stack không lấy được quyền root.

NGUYỄN THI PHÚ 21110600


NGUYỄN THI PHÚ 21110600
NGUYỄN THI PHÚ 21110600
NGUYỄN THI PHÚ 21110600

You might also like