Nó chỉ trả về mã shell đã thoát ở định dạng Little Endian cho bất kỳ địa chỉ bộ nhớ nào được gửi làm đối số đầu tiên
Nó đủ thông minh để phân biệt giữa các địa chỉ có tiền tố 0x
và các tài khoản cho điều đó
Nếu địa chỉ chỉ nằm trong phạm vi 64 bit, bạn sẽ chỉ nhận được đầu ra 64 bit
Nếu địa chỉ có thể vừa với phạm vi x86_64, bạn sẽ nhận được cả đầu ra 32 và 64 bit
Cài đặt cho python3 qua PyPI
pip3 install lilendian
Cài đặt cho python2 thông qua thiết lập. py
python setup.py install
Chạy tại chỗ
./lilendian [single memory address]
ví dụ
$ ./lilendian deadbeef
\xef\xbe\xad\xde
\xef\xbe\xad\xde\x00\x00\x00\x00
$ ./lilendian 0xdeadbeef
\xef\xbe\xad\xde
\xef\xbe\xad\xde\x00\x00\x00\x00
$ ./lilendian 0x00007fffffffd980
\x80\xd9\xff\xff\xff\x7f\x00\x00
Đoạn mã ví dụ về tập lệnh Shell
Giả sử bạn muốn lấy một đoạn shellcode 64-bit cho 0xdeadbeef + 0xbadcafe + 0xcafebabe + 0xabadbabe
for addr in {0xdeadbeef,0xbadcafe,0xcafebabe,0xabadbabe}; do lilendian $addr | tail -1 done | tr -d "\n"; echo Output: \xef\xbe\xad\xde\x00\x00\x00\x00\xfe\xca\xad\x0b\x00\x00\x00\x00\xbe\xba\xfe\xca\x00\x00\x00\x00\xbe\xba\xad\xab\x00\x00\x00\x00
Sao chép và dán thẳng anh chàng đó vào tải trọng của bạn
Gọi từ bên trong gdb
[gdb] ! lilendian 0xdeadbeef
\xef\xbe\xad\xde
\xef\xbe\xad\xde\x00\x00\x00\x00
Tương lai
Tôi có thể điều chỉnh nó trong tương lai để lấy nhiều địa chỉ bộ nhớ, nhưng hiện tại, nó chỉ xuất ra một địa chỉ bộ nhớ duy nhất
TIL mô-đun cấu trúc thư viện chuẩn Python mặc định diễn giải các chuỗi nhị phân bằng cách sử dụng độ bền của máy của bạn
Điều đó có nghĩa là mã này
def decode_matchinfo[buf]: # buf is a bytestring of unsigned integers, each 4 bytes long return struct.unpack["I" * [len[buf] // 4], buf]
Hành xử khác nhau trên big-endian v. s. hệ thống ít endian
Tôi phát hiện ra điều này nhờ báo cáo lỗi này đối với thư viện sqlite-fts4 của tôi
Hàm decode_matchinfo[]
của tôi chạy trên cấu trúc dữ liệu nhị phân do SQLite trả về - biết thêm chi tiết về điều đó trong Khám phá các thuật toán liên quan đến tìm kiếm với SQLite
SQLite không thay đổi định dạng nhị phân tùy thuộc vào độ bền của hệ thống, điều đó có nghĩa là chức năng của tôi ở đây hoạt động chính xác trên các hệ thống endian nhỏ nhưng lại hoạt động sai trên các hệ thống big-endian
Cập nhật. Tôi đã hoàn toàn sai về điều này. SQLite KHÔNG thay đổi định dạng dựa trên độ bền của hệ thống. Bản sửa lỗi của tôi không chính xác - xem để biết chi tiết
Trên hệ thống little-endian
>>> buf = b'\x01\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00' >>> decode_matchinfo[buf] [1, 2, 2, 2]
Nhưng trên các hệ thống big-endian
>>> buf = b'\x01\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00' >>> decode_matchinfo[buf] [16777216, 33554432, 33554432, 33554432]
Cách khắc phục là thêm một ký tự đầu tiên vào chuỗi định dạng đó để chỉ định độ bền nên được sử dụng, xem trong tài liệu Python
>> Một cái gì đó giống như tiện ích "tệp" cho linux sẽ rất hữu ích
>>
>> Mọi trợ giúp đều được đánh giá cao
>Bạn sẽ phải mô tả chi tiết những gì trong hồ sơ trước đó
> ai cũng có thể giúp
Chúng tôi đang tạo bên trong hệ thống xây dựng của mình cho một hệ thống nhúng một hệ thống tệp cram
hình ảnh. Sau này trong quá trình xây dựng của chúng tôi, chúng tôi phải kiểm tra độ bền,
bởi vì nó có thể là Little Endian hoặc big endian [cánh tay hoặc ppc]
Đầu ra của công cụ "tệp" là một hình ảnh cramfs cuối nhỏ
Dữ liệu hệ thống tệp ROM nén Linux, kích thước endian nhỏ 1875968
phiên bản #2 sorted_dirs CRC 0x8721dfc0, phiên bản 0, 462 khối, 10 tệp
Nó sẽ có thể thực hiện
nghỉ = os. hệ thống ["tệp. grep "endian nhỏ"]
và đánh giá mã trả về
Nhưng tôi không muốn đánh giá một lệnh hệ thống đường ống. Nếu có một cách mà không có
sử dụng hệ điều hành. lệnh hệ thống, điều này sẽ rất tuyệt
Trân trọng
bao bì
Mô-đun này chuyển đổi giữa các giá trị Python và cấu trúc C được biểu diễn dưới dạng các đối tượng Python. Rút gọn mô tả các chuyển đổi dự định sang/từ các giá trị Python. Các chức năng và đối tượng của mô-đun có thể được sử dụng cho hai ứng dụng phần lớn là khác biệt, trao đổi dữ liệu với các nguồn bên ngoài [tệp hoặc kết nối mạng] hoặc truyền dữ liệu giữa ứng dụng Python và lớp C
Ghi chú
Khi không có ký tự tiền tố nào được cung cấp, chế độ gốc là mặc định. Nó đóng gói hoặc giải nén dữ liệu dựa trên nền tảng và trình biên dịch mà trình thông dịch Python được xây dựng trên đó. Kết quả của việc đóng gói một cấu trúc C nhất định bao gồm các byte đệm duy trì sự liên kết phù hợp cho các loại C có liên quan; . Ngược lại, khi truyền dữ liệu giữa các nguồn bên ngoài, lập trình viên chịu trách nhiệm xác định thứ tự byte và phần đệm giữa các phần tử. Xem để biết chi tiết
Một số hàm [và phương thức của ] nhận đối số bộ đệm. Điều này đề cập đến các đối tượng thực hiện và cung cấp bộ đệm có thể đọc được hoặc có thể ghi được. Các loại phổ biến nhất được sử dụng cho mục đích đó là và, nhưng nhiều loại khác có thể được xem như một mảng byte thực hiện giao thức bộ đệm, để chúng có thể được đọc/điền mà không cần sao chép thêm từ một đối tượng
Chức năng và ngoại lệ
Mô-đun xác định các chức năng và ngoại lệ sau
ngoại lệ cấu trúc. lỗiNgoại lệ được đưa ra vào những dịp khác nhau;
cấu trúc. gói[định dạng , v1 . , v2, ...]Trả về đối tượng bytes chứa các giá trị v1, v2,… được đóng gói theo định dạng chuỗi định dạng. Các đối số phải khớp chính xác với các giá trị theo yêu cầu của định dạng
cấu trúc. pack_into[định dạng , bộ đệm . , offset, v1, v2, ...]Đóng gói các giá trị v1, v2, … theo định dạng chuỗi định dạng và ghi các byte đã đóng gói vào bộ đệm đệm có thể ghi bắt đầu từ vị trí offset. Lưu ý rằng offset là đối số bắt buộc
cấu trúc. giải nén[định dạng , bộ đệm]Giải nén từ bộ đệm đệm [có lẽ được đóng gói bởi
>>> pack[">h", 99999] Traceback [most recent call last]: File "", line 1, in struct.error: 'h' format requires -32768 > pack[">h", 99999] Traceback [most recent call last]: File "", line 1, in struct.error: 'h' format requires -32768 > pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'2
tự nhiên
tự nhiên
tự nhiên
>>> pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'3
tự nhiên
Tiêu chuẩn
không ai
>>> pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'4
người tí hon
Tiêu chuẩn
không ai
>>> pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'5
người lớn
Tiêu chuẩn
không ai
>>> pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'6
mạng [= big-endian]
Tiêu chuẩn
không ai
Nếu ký tự đầu tiên không phải là một trong những ký tự này, thì
>>> pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'7 được giả định
Thứ tự byte gốc là big-endian hoặc little-endian, tùy thuộc vào hệ thống máy chủ. Ví dụ: Intel x86, AMD64 [x86-64] và Apple M1 là ít cấp cuối; . Sử dụng để kiểm tra độ bền của hệ thống của bạn
Kích thước gốc và căn chỉnh được xác định bằng cách sử dụng biểu thức
>>> pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'9 của trình biên dịch C. Điều này luôn được kết hợp với thứ tự byte gốc
Kích thước tiêu chuẩn chỉ phụ thuộc vào ký tự định dạng;
Lưu ý sự khác biệt giữa
>>> pack["@ccc", b'1', b'2', b'3'] b'123' >>> pack["@3s", b'123'] b'123'7 và
>>> record = b'raymond \x32\x12\x08\x01\x08' >>> name, serialnum, school, gradelevel = unpack['bhl', b'\x01\x00\x02\x00\x00\x00\x03' [1, 2, 3] >>> calcsize['>bhl'] 7
Cố gắng đóng gói một số nguyên quá lớn đối với trường đã xác định
>>> pack[">h", 99999] Traceback [most recent call last]: File "", line 1, in struct.error: 'h' format requires -32768 > calcsize['