1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo thực hành môn học lập trình an toàn và khai thác lỗ hổng phần mềm tên chủ Đề lab4 format string

16 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lab4 Format String
Tác giả Phạm Trung Thành, Đào Anh Thiên, Hồ Vĩnh Nhật, Lê Ngọc Hiếu
Người hướng dẫn GVHD: Nguyễn Hữu Quyền
Trường học Trường Đại học Công nghệ Thông tin
Chuyên ngành Lập trình an toàn và khai thác lỗ hổng phần mềm
Thể loại báo cáo thực hành
Định dạng
Số trang 16
Dung lượng 2,99 MB

Nội dung

Continue bằng lệnh: cContinue bằng lệnh: c thích ý nghĩa của chuỗi định dạng và lý do có thể in được giá trị cần thiết.. Bonus: chuỗi s không dài hơn 10 ký tự Theo kết quả trên thì %08x

Trang 1

GVHD: Nguyễn Hữu Quyền

Nhóm: 9

1 THÔNG TIN CHUNG:

Lớp: NT521.P11.ANTT

2 NỘI DUNG THỰC HIỆN: 1

6

7

Phần bên dưới của báo cáo này là tài liệu báo cáo chi tiết của nhóm thực hiện.

1Ghi nội dung công việc, các kịch bản trong bài Thực hành

Trang 2

BÁO CÁO CHI TIẾT

B.1 Tìm hiểu về chuỗi định dạng

hoàn thành các chuỗi định dạng cần sử dụng để thực hiện yêu cầu bên dưới.

1 In ra 1 số nguyên hệ thập phân %d

2 In ra 1 số nguyên 4 byte hệ thập phân,

trong đó luôn có đủ 8 số hexan 0x%08x

3 In ra số nguyên dương, có ký hiệu + phía

trước và chiếm ít nhất 5 ký tự, nếu không

đủ thì thêm 0

%+05d

4 In tối đa chuỗi 8 ký tự, nếu dư sẽ cắt bớt %.8s

5 In ra 1 số thực, đầu ra chiếm ít nhất 7 ký

tự và luôn hiển thị 3 chữ số thập phân, đệm

khoảng trắng

%7.3f

6 In ra 1 số thực, đầu ra chiếm ít nhất 7 ký

tự và luôn hiển thị 3 chữ số thập phân, đệm

ký tự 0

%07.3f

B.2 Khai thác lỗ hổng format string để đọc dữ liệu

B.2.1 Đọc dữ liệu trong ngăn xếp – stack

Bước 1 Nhập chuỗi s bình thường

Bước 2 Nhập chuỗi s là 1 chuỗi định dạng

Giả sử nhập s là 1 chuỗi có dạng “%08x.%08x.%08x”

Giải thích ý nghĩa của chuỗi định dạng trên?

PAGE \* MERGEFORMAT

Trang 3

Bước 3 Phân tích kết quả nhận được

Chạy lệnh: dissas main

Đặt break point

Sau đó nhập chuỗi %08x.%08x.%08x.

Trang 4

Continue bằng lệnh: c

Continue bằng lệnh: c

thích ý nghĩa của chuỗi định dạng và lý do có thể in được giá trị cần thiết.

Bonus: chuỗi s không dài hơn 10 ký tự

Theo kết quả trên thì %08x sẽ in giá trị trong các địa chỉ từ địa chỉ bắt đầu của hàm in thứ

hai 0xffffcec0

Khi chạy lệnh start

PAGE \* MERGEFORMAT

Trang 5

Thì thấy biến c nằm ở địa chỉ 0x80484ba và giá trị cụ thể là 0xffffcf44

Còn địa chỉ của hàm print là 0xffffced0

Sử dụng lệnh: x/40wx 0xffffced0

Từ bảng trên biết được từ địa chỉ bắt đầu là 0xffffcee0 đến phần (0xffffffff 0x22222222

0x00000001) là 29 địa chỉ

Trang 6

Như vậy, để đọc được đến dữ liệu tại khung màu xanh, cần bao nhiêu ký hiệu %x?

Vậy một chuỗi sẽ có đúng 29 %x sẽ xuất ra đến giá trị của biến c:

Điều này nghĩa là giá trị của biến c nằm ở tham số thứ 29 từ vị trí bắt của chuỗi (tính luôn

địa chỉ bắt đầu là một tham số)

Vậy sử dụng chuỗi định dạng %Y$x(với Y là số nguyên dương)

Y là giá trị offset, offset là khoảng cách giữa địa chỉ hiện tại (địa chỉ bắt đầu của chuỗi) đến

địa chỉ cần đến

x là in ra giá trị ở dạng thập lục phân (hex)

Thì ở đây chuỗi cần nhập là %29$x

Hoặc nếu muốn in ra ở dạng thập phân (dec)

Thì nhập chuỗi %29%d

So sánh giá trị k và m ở 2 cách này?

Vậy k và m cũng là 29

B.2.2 Đọc chuỗi trong ngăn xếp

lỗi chương trình?

- Thực hiện nhập chuỗi %s%s%s%s thì thấy chương trình xảy ra lỗi Segmentation

fault

- Tiến hành disassemble main để xem được code assembly của hàm main

PAGE \* MERGEFORMAT

Trang 7

- Tiến hành đặt một breakpoint tại hàm print thứ hai

- Ta thấy với lệnh printf thứ 2 thì 3 giá trị tạo 0xffffcef4, 0xffffcef8, 0xffffcefc lần

lượt là tham số dành cho 4 format %s, được mong đợi là địa chỉ chứa chuỗi cần in

- Ta thấy thanh ghi eax đang hiển thị một giá trị 0xf7fc0700 nhưng địa chỉ này không

hợp lệ vì thế gây ra segmentation fault

Trang 8

- Thử lại một lần nữa với chuỗi %p%p%p%p thì kết quả trả về một địa chỉ 0x70257025 Một

địa chỉ không tồn tại trong stack nên chương trình cũng bị crash

B.2.3 Đọc dữ liệu từ địa chỉ tùy ý

- Tạo một breakpoint tại hàm scanf Tham số thứ 2 của hàm scanf chính là địa chỉ lưu

của chuỗi cần đọc

- Xem hàm printf thứ 2, tham số đầu tiên được đặt ở 0xffffcef0

PAGE \* MERGEFORMAT

Trang 9

- Ta xem các địa chỉ nằm gần địa chỉ 0xffffcef0 Ta địa chỉ cần đọc nằm ở tham số thứ

5

(GOT) và lấy về địa chỉ của hàm scanf.Giải thích ý nghĩa của chuỗi định dạng và lý do

có thể in được giá trị cần thiết.

- Dòng 1: Import thư viện pwn

- Dòng 2: Khởi chạy chương trình app-leak

- Dòng 3: Tạo một ELF từ chương trình app-leak để có thể truy cập vào các thông tin

như GOT,

- Dòng 5: Láy địa chỉ của _isoc00_scanf_got trong GOT

- Dòng 6: In ra địa chỉ scanf lấy trong GOT

- Dòng 9: Format String để lấy địa chỉ trong bộ nhớ

- Dòng 10: Lấy địa chỉ scanf trong GOT ghép với format string để tạo ra payload p32

đóng gói một số nguyên 32-bit thành một chuỗi byte có độ dài 4 byte

- Dòng 11: in ra payload

- Dòng 13: gửi payload tới app-leak

- Dòng 14: Đọc kết quả được trả về đến khi có được format string được in ra

- Dòng 16: sh.recv(): Nhận dữ liệu từ ứng dụng u32(sh.recv()[4:8]): Lấy 4 byte tiếp

theo, chuyển chúng thành địa chỉ thực của scanf

Trang 10

- Kết quả

thành giá trị 16 Giải thích ý nghĩa của chuỗi định dạng và lý do có thể in được giá trị cần

thiết:

- B1: compile file app-overwrite ở dạng 32-bit.Cần tải gcc-multilib để có thể compile

dạng 32 bit

PAGE \* MERGEFORMAT

Trang 11

- B3: Tìm thứ tự tham số của chuỗi s

Trong hàm scanf, chuỗi s nằm ở 0xffffcee8

Trong hàm printf, tham số bắt đầu từ 0xffffced0

Trang 12

Cần truyền vào tham số thứ (cee8 - ced0 )/4 = 6

- B4: Xác định chuỗi định dạng để ghi đè

Do cần thêm 12 ký tự dạng hex, sử dụng định dạng “%12x”

Kết quả sau khi tấn công:

Yêu cầu 6 : Sinh viên khai thác và truyền chuỗi s để ghi đè biến a của file app overwrite thành giá

trị 2 Giải thích ý nghĩa của chuỗi định dạng và lý do có thể in được giá trị cần thiết.

Bước 1 : tìm địa chỉ biến a

PAGE \* MERGEFORMAT

Trang 13

è a là biến cục bộ và có địa chỉ là 0x0804a024

Bước 2 ,Bước 2 Tìm kiếm địa chỉ của tham số thứ 2 của lệnh scanf (tham số thứ nhất là chuỗi

định dạng ) tương tự như bài 5

đặt berak point tạ hàm scanf và chạy lệnh run

bước 3: Tìm địa chỉ bắt đầu các tham số của hàm printf thứ 2 trong code

đặt break point tại hàm printf thứ 2 và chạy lệnh run

Bước 4 tương tự yêu cầu 5 tuy nhiên payload sẽ có chút khác : ta sẽ có

padding = b'aa'

Trang 14

format = b'xx'

overwrite = b'%8$n' k=8 vì ta có vị trí của tham sô tương ứng với địa chỉ chứa địa chỉ của

biến a được thêm vô trước đó 2 ký tự a và x tương ứng với 1 tham số và thêm địa chỉ là thêm 2

tham số và địa chỉ bắt đầu chuổi s là tham số thứ 7 nên tham số tương ứng địa chỉ biến a là 9 =>

k=8

payload = format + overwrite+ padding + p32(a_addr) Bước 4 : thực hiện tao code để

truyền chuỗi để ghi đè

Bước 5 : viết code thực hiện khai thác lỗ hổng

Trong đó :

- a_addr : là giá trị địa chỉ biến a đã được khai thác ở bước 1

- padding = b'xx'; format_str = b'aa'; overwrite = b'%8$n'; payload = format_str + overwrite +

padding + p32(a_addr) : thao tác tạo payload theo bước 3

( tên biến hơi sai xin cảm thông tại em vội chưa sửa kịp)

Kết quả :

PAGE \* MERGEFORMAT

Trang 15

 0x0804a028

Bước 2 : tương tự yêu cầu 6

Bước 3 : xác định tham số thứ 2 của hàm scanf sẽ là tham số thứ mấy

nếu muốn ghi đè và chuỗi định dạng cần có

Tương tự yêu cầu 5 tham số thứ 2 của scanf sẽ là tham số thứ 7 của

printf

Xác định độ dài chuỗi cần nhập payload

Ta nhập theo định dạng sau :

[additional format]%<m-1>$n[padding][overwrite addr]

Tuy nhiên chuỗi cần ghi đè là 0x12345678 để dễ dàng cho việc ghi đè ta

tách chuỗi này ra làm nhiều phần

 Đ d dàng thì ta chia làm 4 ph n : 12, 34, 56, 78 l n lể ễ ầ ầ ượ ứt ng đ t ng v i các giá tr ặ ứ ớ ị

af X1 X2 X3 X4

 Ta bi t $n sẽ in ra sô lế ượng ký t đã đ c nên n u ta đ nh sau %mự ọ ế ễ ư 1x%k$hn%m2x

%k+x$hn

 m2 + m1 = X2 và X1 =m1 v y mậ i sẽ là giá tr trênh l nh gi a các Xị ệ ữ i v i các X trớ ước đó

 V y ta có công th c payload nh sau %Xậ ứ ư 1x%k-i$hhn…….%(Xi-Xi-1-… )x%k&hhn

** Hhn trong đây là ghi 1 byte vô địa chỉ chỉ định tại vì khi chia

0x12345678 4 phần mỗi phần sẽ là 1 byte

 V y payload c a ta sẽ là :ậ ủ

%18x%k-3$hhn %34x%k-2$hhn %34x%k-1$hhn %34x%k$hhn + [địa

chỉ còn chỏ bị chia ra 4 phần ]

Trang 16

Ta có 1 tham số tương ứng với một ô địa chỉ giá trị hex và cứ 2 bit sẽ là

1 ký tự asccii

Vậy với mỗi %mx(m là số có 2 chữ số) ta cần 4 tham số vậy tổng cộng

có 10 tham số chưa tính các chuỗi định dạng nên số tham số sẽ lớn hơn

10 và bé hơn 100

Ta có các chuỗi định dạng có kiểu %k$hhn và k là số có 2 chữ số

 Nên chu i này có 7 ký t và có 4 chu i nh th v y ta c n thêm 7 tham s cho các ỗ ụ ỗ ư ế ậ ầ ố

chu i đ nh d ng => c n 17 tham s ch a k đ a ch c a bỗ ị ạ ầ ố ư ể ị ỉ ủ

 Ti p đó vì ta chia ra 4 ph n và m i ph n ng v i m t byte c a đ a ch b nên ta có 4 ế ầ ỗ ầ ứ ớ ộ ủ ị ỉ

tham s sau sẽ là \xAB\x12\x04\x08 \xAC\x12\x04\x08 \xAD\x12\x04\x08 \xAE\ố

x12\x04\x08

Kết quả chạy :

PAGE \* MERGEFORMAT

Ngày đăng: 25/12/2024, 19:29

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w