def test_create_message_with_object(self): message = RequestPDU() message['pfx_flags'].set_flag(PFlags.PFC_OBJECT_UUID) message['packed_drep'] = DataRepresentationFormat() message['call_id'] = 4 message['cont_id'] = 1 message['opnum'] = 10 message['object'] = b"\xff" * 16 message['stub_data'] = b"\x01\x02\x03\x04" expected = b"\x05" \ b"\x00" \ b"\x00" \ b"\x80" \ b"\x10\x00\x00\x00" \ b"\x2c\x00" \ b"\x00\x00" \ b"\x04\x00\x00\x00" \ b"\x00\x00\x00\x00" \ b"\x01\x00" \ b"\x0a\x00" \ b"\xff\xff\xff\xff\xff\xff\xff\xff" \ b"\xff\xff\xff\xff\xff\xff\xff\xff" \ b"\x01\x02\x03\x04" actual = message.pack() assert len(message) == 44 assert actual == expected
def test_parse_message_with_object(self): actual = RequestPDU() data = b"\x05" \ b"\x00" \ b"\x00" \ b"\x80" \ b"\x10\x00\x00\x00" \ b"\x2c\x00" \ b"\x00\x00" \ b"\x04\x00\x00\x00" \ b"\x00\x00\x00\x00" \ b"\x01\x00" \ b"\x0a\x00" \ b"\xff\xff\xff\xff\xff\xff\xff\xff" \ b"\xff\xff\xff\xff\xff\xff\xff\xff" \ b"\x01\x02\x03\x04" data = actual.unpack(data) assert len(actual) == 44 assert data == b"" assert actual['rpc_vers'].get_value() == 5 assert actual['rpc_vers_minor'].get_value() == 0 assert actual['ptype'].get_value() == PType.REQUEST assert actual['pfx_flags'].get_value() == 128 assert actual['packed_drep'].pack() == b"\x10\x00\x00\x00" assert actual['frag_length'].get_value() == 44 assert actual['auth_length'].get_value() == 0 assert actual['call_id'].get_value() == 4 assert actual['alloc_hint'].get_value() == 0 assert actual['cont_id'].get_value() == 1 assert actual['opnum'].get_value() == 10 assert actual['object'].get_value() == b"\xff" * 16 assert actual['stub_data'].get_value() == b"\x01\x02\x03\x04" assert actual['auth_verifier'].get_value() == b""
def _invoke(self, function_name, opnum, data): req = RequestPDU() req['pfx_flags'].set_flag(PFlags.PFC_FIRST_FRAG) req['pfx_flags'].set_flag(PFlags.PFC_LAST_FRAG) req['packed_drep'] = DataRepresentationFormat() req['call_id'] = self.call_id self.call_id += 1 req['opnum'] = opnum req['stub_data'] = data ioctl_request = SMB2IOCTLRequest() ioctl_request['ctl_code'] = CtlCode.FSCTL_PIPE_TRANSCEIVE ioctl_request['file_id'] = self.handle.file_id ioctl_request['max_output_response'] = 1024 ioctl_request['flags'] = IOCTLFlags.SMB2_0_IOCTL_IS_FSCTL ioctl_request['buffer'] = req session_id = self.tree.session.session_id tree_id = self.tree.tree_connect_id log.info("Sending svcctl RPC request for %s" % function_name) log.debug(str(req)) request = self.tree.session.connection.send(ioctl_request, sid=session_id, tid=tree_id) log.info("Receiving svcctl RPC response for %s" % function_name) resp = self.tree.session.connection.receive(request) ioctl_resp = SMB2IOCTLResponse() ioctl_resp.unpack(resp['data'].get_value()) log.debug(str(ioctl_resp)) pdu_resp = self._parse_pdu(ioctl_resp['buffer'].get_value(), opnum) return pdu_resp
def test_create_message(self): message = RequestPDU() message['packed_drep'] = DataRepresentationFormat() message['call_id'] = 4 message['cont_id'] = 1 message['opnum'] = 10 message['stub_data'] = b"\x01\x02\x03\x04" expected = b"\x05" \ b"\x00" \ b"\x00" \ b"\x00" \ b"\x10\x00\x00\x00" \ b"\x1c\x00" \ b"\x00\x00" \ b"\x04\x00\x00\x00" \ b"\x00\x00\x00\x00" \ b"\x01\x00" \ b"\x0a\x00" \ b"\x01\x02\x03\x04" actual = message.pack() assert len(message) == 28 assert actual == expected