You are on page 1of 4

Task 5:

chạy thử chương trình:

dựa theo source code thì a có thể biết được rằng địa chỉ được output ra chính là địa chỉ đầu
tiên của chuỗi, vào sau đó ct bắt ta nhập vào 1 chuỗi bất kì.

nhìn vào source code ta cũng có thể thấy được lỗi có thể khai thác được là BOF bởi vì hàm
gets() sẽ nhận hết tất cả input từ bàn phím rồi đưa nó vào stack và khi kiểm tra các chế độ bảo vệ thì
canary đã bị disable.

đặc biệt là mình có thể nhìn thấy được chế độ bảo vệ NX cũng đã được disable đồng nghĩa với việc
ta có thể thực hiện lệnh ở trên stack -> có thể chạy shellcode trên stack để chiếm shell của hệ thống
(kỹ thuật shellcode).

thực hiện debug để lấy các tham số sau:


địa chỉ của chuỗi buffer
địa chỉ của thanh ghi RSP dang trỏ đến khi tới lệnh ret
-> từ đó tính Được số byte cần nhập để có thể ghi đè lên địa chỉ ret sẽ trả về
(lệnh ret: sẽ làm chương trình nhảy đến địa chỉ được lưu ở trên đỉnh stack tại lúc ret được
gọi đến)
đặt break point tại 2 địa chỉ: hàm gets và lệnh ret
nhập vào 1 chuỗi bất kì ta được địa chỉ của buffer là 0x7fffffffde00,
địa chỉ của thanh ghi RSP dang trỏ đến khi tới lệnh ret là 0x7fffffffde28

-> khoảng cách là 40 byte


viết thử chơng trình để exploit file binary này
shellcode 64-bit: \x48\x31\xFF\x57\x48\xBF\x2F\x62\x69\x6E\x2F\x2F\x73\x68\x57\x48\x31\xF6\x48\x31\
xD2\x48\x89\xE7\x48\x31\xC0\x48\x83\xC0\x3B\x0F\x05 ( kiếm trên mạng đầy á đừng suy nghĩ tự viết chi cho khổ)

sau khi thử thì ta vẫn chưa lấy được shell


-> debug lại trương trình với input ở trên để xem luồng chương trình hoạt động ra sao
-> lỗi ở đây là mình đã ghi đè lên địa chỉ trả về ban đầu của lệnh ret thành 0xbfc24857bfc33148
kiểm tra trên vmmap để xem địa chỉ 0xbfc24857bfc33148 ở đâu:

-> đại chỉ đó không chứa bất kỳ dữ liệu nào của chương trình. có nghĩa là 0xbfc24857bfc33148 chính là 1 phần
của chuỗi shellcode thế nên ret k thể nhảy đến địa chỉ này để thực hiện lệnh trên stack.
giải pháp khác: theo như ban đầu có đề cập thì chương trình sẽ xuất ra địa chỉ đầu tiên của buff cho nên mình có
thể lấy cái địa chỉ đó để tính ra địa chỉ nào đó trên stack mà có chứa shellcode để thực hiện.
-> cách làm đơn giản nhất đó chính là chèn vào địa chỉ 0x7fffffffde30 (ngay sau địa chỉ
chứ địa chỉ trả về của ret) đoạn shellcode của mình và ghi đè điạ chỉ trả về tại 0x7fffffffde28 thành
0x7fffffffde30 thì có thể chạy shellcode trên stack
-> chiếm được shell

You might also like