Lấy một số đầu ra từ xxd và biến nó thành shellcode có thể sử dụng bằng tay không có gì thú vị, vì vậy công việc của bạn là tự động hóa quy trình.
Quy tắc
Nội dung gửi của bạn có thể là một hàm, lambda, script hoặc bất kỳ tương đương hợp lý nào. Bạn có thể in kết quả hoặc nếu bài đăng của bạn là hàm / lambda thì bạn cũng có thể trả lại.
Chương trình của bạn phải có ba đối số, đầu tiên là một chuỗi chứa đầu ra của xxd, được chạy không có đối số nào ngoài tên tệp, như thế này : xxd some_file
. Dưới đây là một ví dụ về đối số đầu tiên sẽ như thế nào:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Bạn cần lấy phần giữa đó chứa các byte (8 cột đầu tiên sau :
) và biến nó thành shellcode bằng cách xóa bất kỳ khoảng trắng nào, sau đó đặt một \x
trước mỗi byte.
Dưới đây là những gì đầu ra nên cho đầu vào ở trên (bỏ qua mọi đối số khác):
\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Bạn có thể giả sử đối số đầu tiên sẽ luôn là đầu ra xxd hợp lệ, được chạy mà không có đối số nào ngoài tên tệp.
Đầu ra của bạn cũng phải là một chuỗi trong đó dấu gạch chéo ngược là dấu gạch chéo ngược theo nghĩa đen, không được sử dụng làm ký tự thoát. Vì vậy, khi tôi nói "\ x65", tôi không nói về byte 0x65 hay thậm chí là chữ "A". Trong mã, nó sẽ là chuỗi "\ x65".
Đối số thứ hai chỉ định vị trí trong đầu ra xxd, shellcode sẽ bắt đầu và thứ ba chỉ định nơi nó sẽ kết thúc. Nếu đối số thứ ba là -1
, nó sẽ kết thúc ở cuối đầu ra xxd. Đối số thứ hai và thứ ba cũng sẽ luôn không âm, ngoại trừ khi đối số thứ ba là-1
Dưới đây là một số trường hợp thử nghiệm:
Luận điểm 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Đối số 2 : 7
, Đối số 3: e
(đây là cả hai chuỗi đại diện cho số thập lục phân)
Đầu ra: \xc9\xcd\x80\xeb\x16\x5b\x31\xc0
Luận điểm 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Đối số 2 : 0
, Đối số 3:2e
Đầu ra: \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e
Luận điểm 1:
00000000: 31c0 b046 31db 31c9 cd80 eb16 5b31 c088 1..F1.1.....[1..
00000010: 4307 895b 0889 430c b00b 8d4b 088d 530c C..[..C....K..S.
00000020: cd80 e8e5 ffff ff2f 6269 6e2f 7368 4e58 ......./bin/shNX
00000030: 5858 5859 5959 59 XXXYYYY
Đối số 2 : a
, Đối số 3:-1
Đầu ra: \xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58\x59\x59\x59\x59
Mã có ít byte nhất sẽ thắng. Người chiến thắng sẽ được công bố trong bảy ngày, vào ngày 15 tháng 8 năm 2016 (nhưng các bài nộp sau đó vẫn được đánh giá cao).
Cập nhật
Xin chúc mừng @Adnan đã chiến thắng thử thách!
~
thay vì \x7e
. Và chúng ta có thể trở lại \t
thay vì \x09
?
7
trông giống như một chỉ mục dựa trên số 0 và e
là một chỉ mục dựa trên một ( e-7=7
nhưng có 8 mã hex trong đầu ra của bạn), hoặc tôi đang xem xét điều gì?