2009-03-28 28 views
14

Tôi hiện đang làm việc trên một chương trình thu hút các gói TCP được gửi và nhận đến và đi từ một địa chỉ cụ thể. Những gì tôi đang cố gắng để thực hiện là trả lời với các gói tùy chỉnh được thiết kế riêng cho một số gói tin nhận được. Tôi đã thực hiện phân tích cú pháp. Tôi đã có thể tạo ra Ethernet, IP và - cho hầu hết các gói - TCP.TCP: Số seq/ack được tạo ra như thế nào?

Điều duy nhất mà tôi không thể tìm ra là cách xác định số seq/ack.

Mặc dù điều này có thể không liên quan đến vấn đề, chương trình được viết bằng C++ bằng WinPCap. Tôi yêu cầu mọi mẹo, bài viết hoặc các tài nguyên khác có thể giúp tôi.

+0

Vị trí tốt nhất cho thông tin liên quan đến tiêu chuẩn thường là RFC gốc (Yêu cầu nhận xét), trong trường hợp này, [RFC 2018] (http: //tools.ietf .org/html/rfc2018). Nói chung [Wikipedia] (http://en.wikipedia.org/wiki/Transmission_Control_Protocol) cũng là một nơi tốt để xem xét. Nếu không, bạn gần như chắc chắn sẽ nhận được kết quả [ở đây] (http://tinyurl.com/dkkjfn). –

Trả lời

23

Khi kết nối TCP được thiết lập, mỗi bên tạo một số ngẫu nhiên làm số thứ tự ban đầu của nó. Đó là một số ngẫu nhiên mạnh mẽ: có vấn đề bảo mật nếu bất kỳ ai trên internet có thể đoán số thứ tự, vì chúng có thể dễ dàng giả mạo các gói tin để tiêm vào luồng TCP.

Sau đó, đối với mỗi byte truyền số thứ tự sẽ tăng thêm 1. Trường ACK là số thứ tự từ phía bên kia, được gửi lại để xác nhận việc nhận.

RFC 793 (đặc tả giao thức TCP gốc) sẽ có ích rất nhiều.

+2

Không phải là trường ack * không * số seq # từ phía bên kia, nhưng seq # + nhận được độ dài (như trong zainee khan trả lời dưới đây) –

0

Số thứ tự tăng sau khi kết nối được thiết lập. Số thứ tự ban đầu trên một kết nối mới được lựa chọn lý tưởng một cách ngẫu nhiên nhưng rất nhiều hệ điều hành có một số thuật toán bán ngẫu nhiên. RFC là nơi tốt nhất để tìm hiểu thêm TCP RFC.

1

RFC 793 phần 3.3 bao gồm số thứ tự. Thời gian qua tôi đã viết mã ở cấp độ đó, tôi nghĩ rằng chúng tôi chỉ giữ một truy cập một lần cho các số thứ tự tồn tại.

1

Các giá trị này tham chiếu các khoảng bù mong đợi khi bắt đầu tải trọng cho gói tương ứng với số thứ tự ban đầu cho kết nối.

Reference

Sequence number (32 bit) - có một vai trò kép Nếu cờ SYN được thiết lập, sau đó đây là số thứ tự ban đầu. Số chuỗi các byte đầu tiên dữ liệu thực tế sau đó sẽ được trình tự này số cộng 1. Nếu cờ SYN không phải là bộ, thì đây là số thứ tự của byte dữ liệu đầu tiên

Lời cảm ơn số (32 bit) - nếu cờ ACK là đặt thì giá trị của trường này là byte dự kiến ​​tiếp theo mà máy thu mong đợi.

1

Số được tạo ngẫu nhiên từ cả hai bên, sau đó tăng số lượng octet (byte) gửi.

2

Có vẻ như là phần còn lại của câu trả lời giải thích khá nhiều bài về nơi để tìm kiếm thông tin chi tiết và chính thức về ACK, cụ thể là TCP RFC

Đây là một trang thực tế hơn và "dễ hiểu" mà tôi tìm thấy khi tôi đang làm tương tự triển khai cũng có thể giúp TCP Analysis - Section 2: Sequence & Acknowledgement Numbers

+0

Cảm ơn bạn đã liên kết :) – xian

+0

cảm ơn liên kết –

4

Nếu tôi hiểu chính xác bạn - bạn đang cố gắng gắn một số TCP SEQ prediction attack. Nếu đúng như vậy, bạn sẽ muốn nghiên cứu chi tiết về máy phát điện Initial Sequence Number của hệ điều hành đích của bạn.

Đã có các lỗ hổng được công khai rộng rãi trong khá nhiều all the major OS's wrt máy phát ISN của chúng có thể dự đoán được. Tôi đã không theo dõi sát sao, nhưng sự hiểu biết của tôi là hầu hết các nhà cung cấp đã phát hành các bản vá lỗi cho randomize their ISN increments.

4

Tôi có cùng một công việc để làm. Trước tiên, seq # ban đầu sẽ được tạo ngẫu nhiên (0-4294967297). Sau đó, người nhận sẽ tính độ dài của dữ liệu nhận được và gửi ACK của seq# + length = x tới người gửi. Trình tự sau đó sẽ là x và người gửi sẽ gửi dữ liệu. Tương tự như vậy người nhận sẽ đếm chiều dài x + length = y và gửi ACK là y và cứ thế ... Làm thế nào mà seq/ack được tạo ra ...

Nếu bạn muốn hiển thị nó thực tế cố gắng ngửi gói trong Wireshark và theo dõi luồng TCP và xem kịch bản ...

+1

Cải thiện độ rõ ràng câu trả lời của bạn. – JSuar

+0

bạn cũng có thể nắm bắt các gói từ thiết bị đầu cuối như thế này: sudo tcpdump -i eth0 – zee

Các vấn đề liên quan