Con trăn nhỏ endian là gì?

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ỗi

Ngoạ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['

Chủ Đề