banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Tạo C Struct trong Python  XML
  [Programming]   Tạo C Struct trong Python 11/10/2008 17:28:42 (+0700) | #1 | 154824
mrro
Administrator

Joined: 27/12/2001 05:07:00
Messages: 745
Offline
[Profile] [PM]
Chào các bạn,

Tớ thấy đề tài này cũng vui nên tớ gửi qua đây để mọi người thảo luận thêm (bài gốc ở /hvaonline/posts/list/20/23615.html#154823).

python có cái module struct rất hữu dụng khi làm việc với mấy cái structure của C/C++. chẳng hạn như tớ đang làm cái drifter3 http://www.overthewire.org/wargames/drifter/level3), nó có mấy cái struct như:

Code:
struct packet {
	unsigned char ops;
	unsigned short int id;
	unsigned short int flags;
	unsigned int assoc;
} __attribute__((__packed__));
typedef struct packet packet;

struct data_assoc {
	unsigned short int len;
	unsigned char buf[0];
} __attribute__((__packed__));
typedef struct data_assoc data_assoc;


drifter3 nó nhận một cái udp packet từ network vào, phần data của packet phải tuân thủ theo đúng hai cái structure này, thì nó mới chịu xử lý và trả về một udp packet. thường có 2 cách để nhập dữ liệu và xử lý kết quả cho mấy chương trình như thế này:

1. nhập và xử lý bằng tay. kiểu như chương trình yêu cầu một packet có ops = 1, id = 1, flags = 0, assoc = 0, thì mình phải nhập vào một chuỗi byte (little-edian) như \x01\x01\x00\x00\x00\x00\x00\x00\x00 rồi đợi chương trình trả kết quả về, và lại unpack kết quả bằng tay tiếp để xem mấy cái member của struct nó có kết quả là gì.

2. rõ ràng làm cách 1 rất chậm và dễ xảy ra lỗi. bất lợi lớn nhất của cách 1 là không thể làm tự động được. ngược lại cách thứ 2 mà tớ sắp nói rất tiện lợi, và hoàn toàn có thể tự động hóa được luôn.

ý tưởng chủ đạo (mà tớ chôm khi đọc source code của bọn nước ngoài :p) là sẽ biến mấy cái struct của C thành class của python, rồi dùng struct.unpack và struct.pack để nhập và xuất dữ liệu. chẳng hạn như đối với cái struct packet ở trên, tớ sẽ viết thành cái class Python như sau:

Code:
class Packet(object):
    def __init__(self, ops=None, id=None, flags=None, assoc=None, bytes=None):
        self.ops = ops
        self.id = id
        self.flags = flags
        self.assoc = assoc
        if bytes:
            self.fromBytes(bytes)

    def fromBytes(self, bytes):
        # little-endian
        (self.ops, self.id, self.flags, self.assoc) = struct.unpack("<BHHI", bytes)

    def toBytes(self):
        # little-endian
        return struct.pack("<BHHI", self.ops, self.id, self.flags, self.assoc)

    def __len__(self):
        return struct.calcsize("<BHHI")

    def __repr__(self):
        return "ops %d, id %d, flags %d, assoc %d " % (self.ops, self.id, self.flags, self.assoc)


với cái class này, tớ có thể tạo và gửi một packet dễ dàng với đoạn mã sau:

Code:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        input = raw_input("ops, id, flags, assoc: ")
        [ops, id, flags, assoc] = input.split(",")
        header = Header(int(ops.strip()), int(id.strip()), int(flags.strip()), int(assoc.strip())) 
        p_out = Packet(header)
        sock.sendto(p_out.toBytes(), ADDR) # hit breakpoint
        data, addr = sock.recvfrom(PKTSIZE)
        p_in = Packet(bytes=data)        
        print repr(p_in)
        sock.close()


chẳng hạn như khi chạy, nó sẽ ra như thế này:

Code:
drifter3@games $ ./level3.py
out = ops, id, flags, assoc: 0,0,0,0
in = ops 0, id 0, flags 1, assoc 3696333875


rất rõ ràng và trong sáng phải không? điều tớ thích nhất ở phương pháp thứ 2 này là tớ có thể tự động hóa được hoàn toàn việc nhập liệu, debug và kiểm tra kết quả.

chẳng hạn như tớ có thể viết script, cài breakpoint trong chương trình, quăng dữ liệu vào và quan sát kết quả cũng như biết rõ những dòng lệnh nào được thực hiện ứng với loại dữ liệu đầu vào nào (nghe giống như fuzzing nhỉ? smilie). Cái này gọi là code coverage, có một tool khá hay làm việc này là Paimei, nhưng nó không chạy trên Linux :-p).

nói đi nói lại thì tớ rất thích cái module struct của python :-p (tớ thích nhất là em ctypes, tớ sẽ không thể sống nổi nếu thiếu em này lolz).

--m
http://tinsang.net

TetCon 2013 http://tetcon.org

Làm an toàn thông tin thì học gì?/hvaonline/posts/list/42133.html
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 10/06/2010 10:43:36 (+0700) | #2 | 212951
zjm_zjm
Member

[Minus]    0    [Plus]
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
Khi mình chạy cái script này thì nó báo không import Header, mà mình không biết import thư viện nào hết smilie
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 11/06/2010 16:52:03 (+0700) | #3 | 213071
[Avatar]
nhanth87
Member

[Minus]    0    [Plus]
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
[Profile] [PM]
Em đọc cuốn python hacking có viết về ctype thấy hay lắm!
Khi mình chạy cái script này thì nó báo không import Header, mà mình không biết import thư viện nào hết smilie  

đây chỉ là class chứ có phải chương trình hoàn chỉnh đâu mà chạy?
Còn phải import ctype, os, network nữa mới được.
Aricent - Software Engineer
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 12/06/2010 09:04:05 (+0700) | #4 | 213123
zjm_zjm
Member

[Minus]    0    [Plus]
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
To nhanth87:
Mình đã import rồi
Còn cái dòng này nè.

header = Header(int(ops.strip()), int(id.strip()), int(flags.strip()), int(assoc.strip()))

Nó báo lỗi ở cái dòng này.

PS bạn có thể share cuốn Python Hacking của bạn không
Thanks smilie


[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 14/06/2010 07:11:50 (+0700) | #5 | 213250
[Avatar]
nhanth87
Member

[Minus]    0    [Plus]
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
[Profile] [PM]
Có vẻ như header của ipv4. Như vậy bạn chỉ cần import os là đủ rồi. Mà ko rõ code trên viết cho win hay linux nhỉ ?

Cuốn này mình mua trên amazon nếu bạn thích thì mình cho bạn mượn photo smilie.
Aricent - Software Engineer
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 14/06/2010 09:12:08 (+0700) | #6 | 213255
zjm_zjm
Member

[Minus]    0    [Plus]
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
Ebook hay là sách. Nếu vậy quá tuyệt rồi,
Bạn cho mình số DT đi hay mail gì cũng được
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 14/06/2010 13:38:37 (+0700) | #7 | 213262
[Avatar]
nhanth87
Member

[Minus]    0    [Plus]
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
[Profile] [PM]
Là sách chứ không phải ebook. Hiện mình đang ở Phan Thiết, cuối tháng sáu mới vào lại sài gòn.
Aricent - Software Engineer
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 15/06/2010 08:24:49 (+0700) | #8 | 213316
zjm_zjm
Member

[Minus]    0    [Plus]
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
Okay bạn cho biết mục lục sách gồm những gì không, Nếu cuối tháng 6 bạn vào thì nhớ cho mình số dt để liên lạc nha ok
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 15/06/2010 08:25:59 (+0700) | #9 | 213317
zjm_zjm
Member

[Minus]    0    [Plus]
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
okay mình có sdt của bạn rồi thanks nha smilie
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 15/06/2010 09:36:20 (+0700) | #10 | 213327
[Avatar]
gamma95
Researcher

Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa&quot;&gt;
Offline
[Profile] [PM] [ICQ]
lolz, topic này trở thành mục "kết bạn 4 phương" ah ???
Mấy thông tin trao đổi làm ơn PM, tránh làm loãng topic
Cánh chym không mỏi
lol
[Up] [Print Copy]
  [Programming]   Tạo C Struct trong Python 15/06/2010 20:36:26 (+0700) | #11 | 213388
[Avatar]
nhanth87
Member

[Minus]    0    [Plus]
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
[Profile] [PM]

gamma95 wrote:
lolz, topic này trở thành mục "kết bạn 4 phương" ah ???
Mấy thông tin trao đổi làm ơn PM, tránh làm loãng topic 

oh, sorry "chị" smilie. Mọi thảo luận ngoài lề đã xong, nhờ mod nào xoá dùm cho khỏi loãng topic smilie.
Aricent - Software Engineer
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|