Tôi có một số tập tin perl đã được "tẩy trắng" (không biết nếu nó là từ ACME :: Bleach, hoặc một cái gì đó tương tự). Không phải là rất thông thạo trong perl, tôi muốn hiểu những gì một lót mà bắt đầu tập làm để giải mã các khoảng trắng mà sau:Dòng perl này từ tệp "tẩy trắng" làm gì?
$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;[email protected]&&[email protected];$_
Phần còn lại của tập tin là ký tự khoảng trắng, và các tập tin là thực thi bởi chính nó (nó được đặt trong thư mục/bin).
[Giải pháp], nhờ @JB.
Phần pack
điều này có vẻ phức tạp nhất và tôi mất một lúc để nhận thấy những gì đang diễn ra. Gói đang sử dụng LSB chỉ trong mỗi 8 ký tự và giải nén nó dưới dạng ký tự lớn trong nhị phân. Vì vậy, các tab trở thành '0' và dấu cách trở thành '1'.
'\t\t \t ' => '#'
in binary:
00001001 00001001 00100000 00100000 00100000 00001001 00100000 0100000
every LSB:
1 1 0 0 0 1 0 0
convert from from big-endian format:
0b00100011 == 35 == ord('#')
OK, tôi nghĩ rằng đó là chức năng 'gói' đang vấp ngã tôi. Bạn có thể làm rõ một cái gì đó như ''\ t \ t \ t'' dịch thành ''#'' không? – JimB
Xin lỗi, có vẻ như các ký tự thô vẫn có dấu cách bị thu hẹp, chuỗi đó phải là tab tab sp sp sp sp sp sp. – JimB
'tab' là' chr (9) ', lẻ; 'sp' là' chr (32) ', thậm chí. Vì vậy, chuỗi của bạn dịch sang bit chuỗi 1, 1, 0, 0, 0, 1, 0, 0, 0, mà (LSB đầu tiên) là 0x23, mã ASCII cho ''#''. (bạn có thêm một chút) –