[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
|
|
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ỉ? ). 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 |
|
|
|
[Programming] Tạo C Struct trong Python |
10/06/2010 10:43:36 (+0700) | #2 | 212951 |
zjm_zjm
Member
|
0 |
|
|
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
|
|
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 |
|
|
|
|
[Programming] Tạo C Struct trong Python |
11/06/2010 16:52:03 (+0700) | #3 | 213071 |
|
nhanth87
Member
|
0 |
|
|
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
|
|
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 |
|
|
|
[Programming] Tạo C Struct trong Python |
12/06/2010 09:04:05 (+0700) | #4 | 213123 |
zjm_zjm
Member
|
0 |
|
|
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
|
|
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
|
|
|
|
|
[Programming] Tạo C Struct trong Python |
14/06/2010 07:11:50 (+0700) | #5 | 213250 |
|
nhanth87
Member
|
0 |
|
|
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
|
|
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 . |
|
Aricent - Software Engineer |
|
|
|
[Programming] Tạo C Struct trong Python |
14/06/2010 09:12:08 (+0700) | #6 | 213255 |
zjm_zjm
Member
|
0 |
|
|
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
|
|
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 |
|
|
|
|
[Programming] Tạo C Struct trong Python |
14/06/2010 13:38:37 (+0700) | #7 | 213262 |
|
nhanth87
Member
|
0 |
|
|
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
|
|
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 |
|
[Programming] Tạo C Struct trong Python |
15/06/2010 08:24:49 (+0700) | #8 | 213316 |
zjm_zjm
Member
|
0 |
|
|
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
|
|
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 |
|
|
[Programming] Tạo C Struct trong Python |
15/06/2010 08:25:59 (+0700) | #9 | 213317 |
zjm_zjm
Member
|
0 |
|
|
Joined: 26/07/2009 01:53:09
Messages: 159
Location: hhhhhh
Offline
|
|
okay mình có sdt của bạn rồi thanks nha |
|
|
[Programming] Tạo C Struct trong Python |
15/06/2010 09:36:20 (+0700) | #10 | 213327 |
|
gamma95
Researcher
|
Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa">
Offline
|
|
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 |
|
|