Professional Documents
Culture Documents
Lab2 Bufferoverflow
Lab2 Bufferoverflow
MSSV : 2110600
Môn học : An toàn thông tin
GV : TS. Huỳnh Nguyên Chính
___________________________
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 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ế 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.