librex 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +4 -0
- data/lib/rex.rb +101 -0
- data/lib/rex.rb.ts.rb +70 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +103 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/sparc.rb.ut.rb +18 -0
- data/lib/rex/arch/x86.rb +513 -0
- data/lib/rex/arch/x86.rb.ut.rb +93 -0
- data/lib/rex/assembly/nasm.rb +100 -0
- data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +281 -0
- data/lib/rex/constants.rb +113 -0
- data/lib/rex/elfparsey.rb +11 -0
- data/lib/rex/elfparsey/elf.rb +123 -0
- data/lib/rex/elfparsey/elfbase.rb +260 -0
- data/lib/rex/elfparsey/exceptions.rb +27 -0
- data/lib/rex/elfscan.rb +12 -0
- data/lib/rex/elfscan/scanner.rb +207 -0
- data/lib/rex/elfscan/search.rb +46 -0
- data/lib/rex/encoder/alpha2.rb +31 -0
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
- data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
- data/lib/rex/encoder/alpha2/generic.rb +113 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
- data/lib/rex/encoder/ndr.rb +89 -0
- data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +106 -0
- data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
- data/lib/rex/encoder/xor.rb +69 -0
- data/lib/rex/encoder/xor/dword.rb +13 -0
- data/lib/rex/encoder/xor/dword_additive.rb +13 -0
- data/lib/rex/encoders/xor_dword.rb +35 -0
- data/lib/rex/encoders/xor_dword_additive.rb +53 -0
- data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
- data/lib/rex/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor.rb.ts.rb +14 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exceptions.rb.ut.rb +44 -0
- data/lib/rex/exploitation/cmdstager.rb +133 -0
- data/lib/rex/exploitation/egghunter.rb +143 -0
- data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
- data/lib/rex/exploitation/encryptjs.rb +77 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +94 -0
- data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
- data/lib/rex/exploitation/obfuscatejs.rb +335 -0
- data/lib/rex/exploitation/opcodedb.rb +818 -0
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
- data/lib/rex/exploitation/seh.rb +92 -0
- data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
- data/lib/rex/file.rb +84 -0
- data/lib/rex/file.rb.ut.rb +16 -0
- data/lib/rex/image_source.rb +12 -0
- data/lib/rex/image_source/disk.rb +60 -0
- data/lib/rex/image_source/image_source.rb +46 -0
- data/lib/rex/image_source/memory.rb +37 -0
- data/lib/rex/io/bidirectional_pipe.rb +157 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/stream.rb +313 -0
- data/lib/rex/io/stream_abstraction.rb +186 -0
- data/lib/rex/io/stream_server.rb +211 -0
- data/lib/rex/job_container.rb +202 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +179 -0
- data/lib/rex/logging/log_sink.rb +42 -0
- data/lib/rex/logging/sinks/flatfile.rb +55 -0
- data/lib/rex/logging/sinks/stderr.rb +43 -0
- data/lib/rex/machparsey.rb +9 -0
- data/lib/rex/machparsey/exceptions.rb +34 -0
- data/lib/rex/machparsey/mach.rb +209 -0
- data/lib/rex/machparsey/machbase.rb +408 -0
- data/lib/rex/machscan.rb +9 -0
- data/lib/rex/machscan/scanner.rb +217 -0
- data/lib/rex/mime.rb +9 -0
- data/lib/rex/mime/header.rb +75 -0
- data/lib/rex/mime/message.rb +112 -0
- data/lib/rex/mime/part.rb +20 -0
- data/lib/rex/nop/opty2.rb +108 -0
- data/lib/rex/nop/opty2.rb.ut.rb +23 -0
- data/lib/rex/nop/opty2_tables.rb +300 -0
- data/lib/rex/ole.rb +128 -0
- data/lib/rex/ole/clsid.rb +47 -0
- data/lib/rex/ole/difat.rb +141 -0
- data/lib/rex/ole/directory.rb +230 -0
- data/lib/rex/ole/direntry.rb +240 -0
- data/lib/rex/ole/fat.rb +99 -0
- data/lib/rex/ole/header.rb +204 -0
- data/lib/rex/ole/minifat.rb +77 -0
- data/lib/rex/ole/samples/create_ole.rb +27 -0
- data/lib/rex/ole/samples/dir.rb +35 -0
- data/lib/rex/ole/samples/dump_stream.rb +34 -0
- data/lib/rex/ole/samples/ole_info.rb +23 -0
- data/lib/rex/ole/storage.rb +395 -0
- data/lib/rex/ole/stream.rb +53 -0
- data/lib/rex/ole/substorage.rb +49 -0
- data/lib/rex/ole/util.rb +157 -0
- data/lib/rex/parser/arguments.rb +97 -0
- data/lib/rex/parser/arguments.rb.ut.rb +67 -0
- data/lib/rex/parser/ini.rb +185 -0
- data/lib/rex/parser/ini.rb.ut.rb +29 -0
- data/lib/rex/parser/nmap_xml.rb +111 -0
- data/lib/rex/payloads.rb +1 -0
- data/lib/rex/payloads/win32.rb +2 -0
- data/lib/rex/payloads/win32/common.rb +26 -0
- data/lib/rex/payloads/win32/kernel.rb +53 -0
- data/lib/rex/payloads/win32/kernel/common.rb +54 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
- data/lib/rex/peparsey.rb +12 -0
- data/lib/rex/peparsey/exceptions.rb +32 -0
- data/lib/rex/peparsey/pe.rb +188 -0
- data/lib/rex/peparsey/pe_memdump.rb +63 -0
- data/lib/rex/peparsey/pebase.rb +1655 -0
- data/lib/rex/peparsey/section.rb +136 -0
- data/lib/rex/pescan.rb +13 -0
- data/lib/rex/pescan/analyze.rb +309 -0
- data/lib/rex/pescan/scanner.rb +206 -0
- data/lib/rex/pescan/search.rb +56 -0
- data/lib/rex/platforms.rb +1 -0
- data/lib/rex/platforms/windows.rb +51 -0
- data/lib/rex/poly.rb +132 -0
- data/lib/rex/poly/block.rb +468 -0
- data/lib/rex/poly/register.rb +100 -0
- data/lib/rex/poly/register/x86.rb +40 -0
- data/lib/rex/post.rb +8 -0
- data/lib/rex/post/dir.rb +51 -0
- data/lib/rex/post/file.rb +172 -0
- data/lib/rex/post/file_stat.rb +220 -0
- data/lib/rex/post/gen.pl +13 -0
- data/lib/rex/post/io.rb +182 -0
- data/lib/rex/post/meterpreter.rb +4 -0
- data/lib/rex/post/meterpreter/channel.rb +438 -0
- data/lib/rex/post/meterpreter/channel_container.rb +54 -0
- data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
- data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
- data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
- data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
- data/lib/rex/post/meterpreter/client.rb +335 -0
- data/lib/rex/post/meterpreter/client_core.rb +274 -0
- data/lib/rex/post/meterpreter/dependencies.rb +3 -0
- data/lib/rex/post/meterpreter/extension.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
- data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
- data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
- data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
- data/lib/rex/post/meterpreter/packet.rb +596 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -0
- data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
- data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
- data/lib/rex/post/meterpreter/ui/console.rb +135 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
- data/lib/rex/post/permission.rb +26 -0
- data/lib/rex/post/process.rb +57 -0
- data/lib/rex/post/thread.rb +57 -0
- data/lib/rex/post/ui.rb +52 -0
- data/lib/rex/proto.rb +12 -0
- data/lib/rex/proto.rb.ts.rb +8 -0
- data/lib/rex/proto/dcerpc.rb +6 -0
- data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
- data/lib/rex/proto/dcerpc/client.rb +358 -0
- data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
- data/lib/rex/proto/dcerpc/handle.rb +47 -0
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
- data/lib/rex/proto/dcerpc/ndr.rb +72 -0
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
- data/lib/rex/proto/dcerpc/packet.rb +253 -0
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
- data/lib/rex/proto/dcerpc/response.rb +186 -0
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
- data/lib/rex/proto/dcerpc/uuid.rb +84 -0
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
- data/lib/rex/proto/drda.rb +5 -0
- data/lib/rex/proto/drda.rb.ts.rb +17 -0
- data/lib/rex/proto/drda/constants.rb +49 -0
- data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
- data/lib/rex/proto/drda/packet.rb +252 -0
- data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
- data/lib/rex/proto/drda/utils.rb +123 -0
- data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
- data/lib/rex/proto/http.rb +5 -0
- data/lib/rex/proto/http.rb.ts.rb +12 -0
- data/lib/rex/proto/http/client.rb +817 -0
- data/lib/rex/proto/http/client.rb.ut.rb +93 -0
- data/lib/rex/proto/http/handler.rb +46 -0
- data/lib/rex/proto/http/handler/erb.rb +128 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
- data/lib/rex/proto/http/handler/proc.rb +54 -0
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
- data/lib/rex/proto/http/header.rb +161 -0
- data/lib/rex/proto/http/header.rb.ut.rb +46 -0
- data/lib/rex/proto/http/packet.rb +394 -0
- data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
- data/lib/rex/proto/http/request.rb +356 -0
- data/lib/rex/proto/http/request.rb.ut.rb +214 -0
- data/lib/rex/proto/http/response.rb +85 -0
- data/lib/rex/proto/http/response.rb.ut.rb +149 -0
- data/lib/rex/proto/http/server.rb +367 -0
- data/lib/rex/proto/http/server.rb.ut.rb +79 -0
- data/lib/rex/proto/smb.rb +7 -0
- data/lib/rex/proto/smb.rb.ts.rb +8 -0
- data/lib/rex/proto/smb/client.rb +1733 -0
- data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
- data/lib/rex/proto/smb/constants.rb +1062 -0
- data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
- data/lib/rex/proto/smb/crypt.rb +95 -0
- data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
- data/lib/rex/proto/smb/evasions.rb +65 -0
- data/lib/rex/proto/smb/exceptions.rb +846 -0
- data/lib/rex/proto/smb/simpleclient.rb +292 -0
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
- data/lib/rex/proto/smb/utils.rb +514 -0
- data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
- data/lib/rex/proto/sunrpc.rb +1 -0
- data/lib/rex/proto/sunrpc/client.rb +195 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +59 -0
- data/lib/rex/script/meterpreter.rb +9 -0
- data/lib/rex/script/shell.rb +9 -0
- data/lib/rex/service.rb +48 -0
- data/lib/rex/service_manager.rb +141 -0
- data/lib/rex/service_manager.rb.ut.rb +32 -0
- data/lib/rex/services/local_relay.rb +423 -0
- data/lib/rex/socket.rb +586 -0
- data/lib/rex/socket.rb.ut.rb +86 -0
- data/lib/rex/socket/comm.rb +119 -0
- data/lib/rex/socket/comm/local.rb +409 -0
- data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
- data/lib/rex/socket/ip.rb +129 -0
- data/lib/rex/socket/parameters.rb +345 -0
- data/lib/rex/socket/parameters.rb.ut.rb +51 -0
- data/lib/rex/socket/range_walker.rb +295 -0
- data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
- data/lib/rex/socket/ssl_tcp.rb +184 -0
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
- data/lib/rex/socket/ssl_tcp_server.rb +122 -0
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
- data/lib/rex/socket/subnet_walker.rb +75 -0
- data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
- data/lib/rex/socket/switch_board.rb +272 -0
- data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
- data/lib/rex/socket/tcp.rb +76 -0
- data/lib/rex/socket/tcp.rb.ut.rb +64 -0
- data/lib/rex/socket/tcp_server.rb +67 -0
- data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
- data/lib/rex/socket/udp.rb +157 -0
- data/lib/rex/socket/udp.rb.ut.rb +44 -0
- data/lib/rex/struct2.rb +5 -0
- data/lib/rex/struct2/c_struct.rb +181 -0
- data/lib/rex/struct2/c_struct_template.rb +39 -0
- data/lib/rex/struct2/constant.rb +26 -0
- data/lib/rex/struct2/element.rb +44 -0
- data/lib/rex/struct2/generic.rb +73 -0
- data/lib/rex/struct2/restraint.rb +54 -0
- data/lib/rex/struct2/s_string.rb +72 -0
- data/lib/rex/struct2/s_struct.rb +111 -0
- data/lib/rex/sync.rb +6 -0
- data/lib/rex/sync/event.rb +94 -0
- data/lib/rex/sync/read_write_lock.rb +176 -0
- data/lib/rex/sync/ref.rb +57 -0
- data/lib/rex/sync/thread_safe.rb +82 -0
- data/lib/rex/test.rb +35 -0
- data/lib/rex/text.rb +1029 -0
- data/lib/rex/text.rb.ut.rb +168 -0
- data/lib/rex/time.rb +65 -0
- data/lib/rex/transformer.rb +115 -0
- data/lib/rex/transformer.rb.ut.rb +38 -0
- data/lib/rex/ui.rb +21 -0
- data/lib/rex/ui/interactive.rb +252 -0
- data/lib/rex/ui/output.rb +80 -0
- data/lib/rex/ui/output/none.rb +18 -0
- data/lib/rex/ui/progress_tracker.rb +96 -0
- data/lib/rex/ui/subscriber.rb +149 -0
- data/lib/rex/ui/text/color.rb +97 -0
- data/lib/rex/ui/text/color.rb.ut.rb +18 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
- data/lib/rex/ui/text/input.rb +117 -0
- data/lib/rex/ui/text/input/buffer.rb +75 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +95 -0
- data/lib/rex/ui/text/input/stdio.rb +45 -0
- data/lib/rex/ui/text/irb_shell.rb +55 -0
- data/lib/rex/ui/text/output.rb +80 -0
- data/lib/rex/ui/text/output/buffer.rb +65 -0
- data/lib/rex/ui/text/output/file.rb +37 -0
- data/lib/rex/ui/text/output/socket.rb +43 -0
- data/lib/rex/ui/text/output/stdio.rb +40 -0
- data/lib/rex/ui/text/progress_tracker.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
- data/lib/rex/ui/text/shell.rb +321 -0
- data/lib/rex/ui/text/table.rb +254 -0
- data/lib/rex/ui/text/table.rb.ut.rb +55 -0
- data/lib/rex/zip.rb +93 -0
- data/lib/rex/zip/archive.rb +91 -0
- data/lib/rex/zip/blocks.rb +182 -0
- data/lib/rex/zip/entry.rb +95 -0
- data/lib/rex/zip/samples/comment.rb +32 -0
- data/lib/rex/zip/samples/mkwar.rb +138 -0
- data/lib/rex/zip/samples/mkzip.rb +19 -0
- data/lib/rex/zip/samples/recursive.rb +58 -0
- metadata +435 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
4
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', 'dev', 'machinetest'))
|
|
5
|
+
|
|
6
|
+
require 'test/unit'
|
|
7
|
+
require 'rex/encoders/xor_dword_additive'
|
|
8
|
+
require 'rex/encoders/xor_dword.rb.ut'
|
|
9
|
+
|
|
10
|
+
class Rex::Encoders::XorDwordAdditive::UnitTest < Rex::Encoders::XorDword::UnitTest
|
|
11
|
+
Klass = Rex::Encoders::XorDwordAdditive
|
|
12
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# make sure the namespace is created
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
module Rex
|
|
8
|
+
module Encoding
|
|
9
|
+
module Xor
|
|
10
|
+
end end end
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# include the Xor encodings
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
require 'rex/encoding/xor/generic'
|
|
17
|
+
require 'rex/encoding/xor/byte'
|
|
18
|
+
require 'rex/encoding/xor/word'
|
|
19
|
+
require 'rex/encoding/xor/dword'
|
|
20
|
+
require 'rex/encoding/xor/qword'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# Xor Encoding Test Suite
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
require 'test/unit'
|
|
10
|
+
require 'rex/encoding/xor/generic.rb.ut'
|
|
11
|
+
require 'rex/encoding/xor/byte.rb.ut'
|
|
12
|
+
require 'rex/encoding/xor/word.rb.ut'
|
|
13
|
+
require 'rex/encoding/xor/dword.rb.ut'
|
|
14
|
+
require 'rex/encoding/xor/dword_additive.rb.ut'
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'rex/encoding/xor/byte'
|
|
6
|
+
require 'rex/encoding/xor/generic.rb.ut'
|
|
7
|
+
|
|
8
|
+
#
|
|
9
|
+
# I suck because I want to inherit a test case, but this will
|
|
10
|
+
# also cause it to run the test case I'm inheriting, so this runs both the
|
|
11
|
+
# Byte and Generic tests, oh well for now...
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
module Rex::Encoding::Xor
|
|
15
|
+
class Byte::UnitTest < Generic::UnitTest
|
|
16
|
+
|
|
17
|
+
def enc
|
|
18
|
+
Byte
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rex/encoding/xor/generic'
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# Routine for xor encoding a buffer by a 2-byte (intel word) key. The perl
|
|
7
|
+
# version used to pad this buffer out to a 2-byte boundary, but I can't think
|
|
8
|
+
# of a good reason to do that anymore, so this doesn't.
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
module Rex
|
|
12
|
+
module Encoding
|
|
13
|
+
module Xor
|
|
14
|
+
|
|
15
|
+
class Dword < Generic
|
|
16
|
+
|
|
17
|
+
def Dword.keysize
|
|
18
|
+
4
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end end end end # Dword/Xor/Encoding/Rex
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'rex/encoding/xor/dword'
|
|
6
|
+
require 'rex/encoding/xor/byte.rb.ut'
|
|
7
|
+
|
|
8
|
+
module Rex::Encoding::Xor
|
|
9
|
+
class Dword::UnitTest < Byte::UnitTest
|
|
10
|
+
|
|
11
|
+
def enc
|
|
12
|
+
Dword
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rex/encoding/xor/exceptions'
|
|
4
|
+
require 'rex/encoding/xor/generic'
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# Routine for xor encoding a buffer by a 2-byte (intel word) key. The perl
|
|
8
|
+
# version used to pad this buffer out to a 2-byte boundary, but I can't think
|
|
9
|
+
# of a good reason to do that anymore, so this doesn't.
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
module Rex
|
|
13
|
+
module Encoding
|
|
14
|
+
module Xor
|
|
15
|
+
|
|
16
|
+
class DwordAdditive < Generic
|
|
17
|
+
|
|
18
|
+
def DwordAdditive.keysize
|
|
19
|
+
4
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def DwordAdditive._packspec
|
|
23
|
+
'V'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def DwordAdditive.pack_key(key)
|
|
27
|
+
return [ key ].pack(_packspec)
|
|
28
|
+
end
|
|
29
|
+
def DwordAdditive.unpack_key(key)
|
|
30
|
+
return key.unpack(_packspec)[0]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# hook in the key mutation routine of encode for the additive feedback
|
|
34
|
+
def DwordAdditive._encode_mutate_key(buf, key, pos, len)
|
|
35
|
+
if (pos + 1) % len == 0
|
|
36
|
+
# add the last len bytes (in this case 4) with the key,
|
|
37
|
+
# dropping off any overflow
|
|
38
|
+
key = pack_key(
|
|
39
|
+
unpack_key(key) + unpack_key(buf[pos - (len - 1), len]) &
|
|
40
|
+
(1 << (len << 3)) - 1
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
return key
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# I realize this algorithm is broken. We invalidate some keys
|
|
49
|
+
# in _find_bad_keys that could actually be perfectly fine. However,
|
|
50
|
+
# it seems to work ok for now, and this is all just a lame adhoc method.
|
|
51
|
+
# Maybe someday we can revisit this and make it a bit less ghetto...
|
|
52
|
+
#
|
|
53
|
+
|
|
54
|
+
def DwordAdditive._find_good_key(data, badkeys, badchars)
|
|
55
|
+
|
|
56
|
+
ksize = keysize
|
|
57
|
+
kstart = ""
|
|
58
|
+
ksize.times { kstart << rand(256) } # random key starting place
|
|
59
|
+
|
|
60
|
+
key = kstart.dup
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# now for the ghettoness of an algorithm:
|
|
64
|
+
# try the random key we picked
|
|
65
|
+
# if the key failed, figure out which key byte corresponds
|
|
66
|
+
# increment that key byte
|
|
67
|
+
# if we wrapped a byte all the way around, fail :(
|
|
68
|
+
#
|
|
69
|
+
|
|
70
|
+
loop do
|
|
71
|
+
# ok, try to encode it, any bad chars present?
|
|
72
|
+
pos = _check(data, key, badchars)
|
|
73
|
+
|
|
74
|
+
# yay, no problems, we found a key!
|
|
75
|
+
break if !pos
|
|
76
|
+
|
|
77
|
+
strip = pos % ksize
|
|
78
|
+
|
|
79
|
+
# increment the offending key byte
|
|
80
|
+
key[strip] = key[strip] + 1 & 0xff
|
|
81
|
+
|
|
82
|
+
# We wrapped around!
|
|
83
|
+
if key[strip] == kstart[strip]
|
|
84
|
+
raise KeySearchError, "Key space exhausted on strip #{strip}!", caller
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
return key
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end end end end # DwordAdditive/Xor/Encoding/Rex
|
|
92
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'rex/encoding/xor/dword_additive'
|
|
6
|
+
require 'rex/encoding/xor/byte.rb.ut'
|
|
7
|
+
|
|
8
|
+
module Rex::Encoding::Xor
|
|
9
|
+
class DwordAdditive::UnitTest < Byte::UnitTest
|
|
10
|
+
|
|
11
|
+
def enc
|
|
12
|
+
DwordAdditive
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rex/encoding/xor/exceptions'
|
|
4
|
+
require 'rex/text'
|
|
5
|
+
|
|
6
|
+
module Rex
|
|
7
|
+
module Encoding
|
|
8
|
+
module Xor
|
|
9
|
+
|
|
10
|
+
class Generic
|
|
11
|
+
|
|
12
|
+
def Generic.keysize
|
|
13
|
+
# special case:
|
|
14
|
+
# 0 means we encode based on the length of the key
|
|
15
|
+
# we don't enforce any perticular key length
|
|
16
|
+
return 0
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Now for some internal check methods
|
|
21
|
+
#
|
|
22
|
+
|
|
23
|
+
# hook stylies!
|
|
24
|
+
# return index of offending byte or nil
|
|
25
|
+
def Generic._check(data, key, badchars)
|
|
26
|
+
return _check_key(key, badchars) || _check_encode(data, key, badchars)
|
|
27
|
+
end
|
|
28
|
+
def Generic._check_key(key, badchars)
|
|
29
|
+
return Rex::Text.badchar_index(key, badchars)
|
|
30
|
+
end
|
|
31
|
+
def Generic._check_encode(data, key, badchars)
|
|
32
|
+
return Rex::Text.badchar_index(encode(data, key), badchars)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def Generic.find_key(data, badchars)
|
|
36
|
+
return _find_good_key(data, _find_bad_keys(data, badchars), badchars)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# !!! xxx MAKE THESE BITCHE PRIVATE
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Find a list of bytes that can't be valid xor keys, from the data and badchars.
|
|
43
|
+
# This returns a Array of hashes, length keysize
|
|
44
|
+
#
|
|
45
|
+
def Generic._find_bad_keys(data, badchars)
|
|
46
|
+
|
|
47
|
+
ksize = keysize
|
|
48
|
+
|
|
49
|
+
# array of hashes for the bad characters based
|
|
50
|
+
# on their position in the data
|
|
51
|
+
badkeys = [ ]
|
|
52
|
+
ksize.times { badkeys << { } }
|
|
53
|
+
|
|
54
|
+
badchars.each_byte { |badchar|
|
|
55
|
+
pos = 0
|
|
56
|
+
data.each_byte { |char|
|
|
57
|
+
badkeys[pos % ksize][char ^ badchar] = true
|
|
58
|
+
pos += 1
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return badkeys
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# (Hopefully) find a good key, from badkeys and badchars
|
|
67
|
+
#
|
|
68
|
+
def Generic._find_good_key(data, badkeys, badchars)
|
|
69
|
+
|
|
70
|
+
ksize = keysize
|
|
71
|
+
strip = 0
|
|
72
|
+
key = ""
|
|
73
|
+
|
|
74
|
+
while strip < keysize
|
|
75
|
+
|
|
76
|
+
kbyte = rand(256)
|
|
77
|
+
|
|
78
|
+
catch(:found_kbyte) do
|
|
79
|
+
256.times {
|
|
80
|
+
|
|
81
|
+
if !badkeys[strip][kbyte] && !badchars[kbyte.chr]
|
|
82
|
+
throw :found_kbyte
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
kbyte = (kbyte + 1) & 0xff
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
raise KeySearchError, "Exhausted byte space for strip #{strip}!", caller
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
key << kbyte
|
|
92
|
+
strip += 1
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# ok, we should have a good key now, lets double check...
|
|
96
|
+
if _check(data, key, badchars)
|
|
97
|
+
raise KeySearchError, "Key found, but bad character check failed!", caller
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
return key
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def Generic.encode(buf, key)
|
|
104
|
+
|
|
105
|
+
if !key.kind_of?(String)
|
|
106
|
+
raise ::ArgumentError, "Key must be a string!", caller
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
len = key.length
|
|
110
|
+
|
|
111
|
+
if len == 0
|
|
112
|
+
raise ::ArgumentError, "Zero key length!", caller
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
if keysize != 0 && keysize != len
|
|
116
|
+
raise ::ArgumentError, "Key length #{len}, expected #{keysize}", caller
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
encoded = ""
|
|
120
|
+
pos = 0
|
|
121
|
+
|
|
122
|
+
while pos < buf.length
|
|
123
|
+
encoded += (buf[pos,1].unpack("C*")[0] ^ key[pos % len, 1].unpack("C*")[0]).chr
|
|
124
|
+
key = _encode_mutate_key(buf, key, pos, len)
|
|
125
|
+
pos += 1
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
return [ encoded, key ]
|
|
129
|
+
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# kind of ghetto, but very convenient for mutating keys
|
|
133
|
+
# by default, do no key mutations
|
|
134
|
+
def Generic._encode_mutate_key(buf, key, pos, len)
|
|
135
|
+
return key
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# maybe a bit a smaller of method name?
|
|
139
|
+
def Generic.find_key_and_encode(data, badchars)
|
|
140
|
+
key = find_key(data, badchars)
|
|
141
|
+
enc, fkey = encode(data, key)
|
|
142
|
+
return [ enc, key, fkey ]
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
end end end end # Generic/Xor/Encoding/Rex
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
4
|
+
|
|
5
|
+
require 'test/unit'
|
|
6
|
+
require 'rex/encoding/xor/generic'
|
|
7
|
+
|
|
8
|
+
module Rex::Encoding::Xor
|
|
9
|
+
|
|
10
|
+
class Generic::UnitTest < ::Test::Unit::TestCase
|
|
11
|
+
|
|
12
|
+
def enc
|
|
13
|
+
Generic
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def hook_static_encode(data, key, expected)
|
|
17
|
+
if enc.keysize != 0 && key.length != enc.keysize
|
|
18
|
+
assert_raise(::ArgumentError) { enc.encode(data,key) }
|
|
19
|
+
else
|
|
20
|
+
assert_equal(enc.encode(data, key), [ expected, key ])
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_static_encode
|
|
25
|
+
# Test key of zero length
|
|
26
|
+
assert_raise(::ArgumentError) { enc.encode("\x00", "") }
|
|
27
|
+
|
|
28
|
+
# Test non-string key
|
|
29
|
+
assert_raise(::ArgumentError) { enc.encode("\x00\x01", 1) }
|
|
30
|
+
|
|
31
|
+
# some simple single byte tests with 0x00
|
|
32
|
+
30.times {
|
|
33
|
+
byte = rand(256).chr
|
|
34
|
+
hook_static_encode("\x00" * 3, byte, byte * 3)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# misc tests, see below
|
|
38
|
+
misc_tests.each { |test|
|
|
39
|
+
hook_static_encode(test[0], test[1], test[2])
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# Misc (mostly) autogenerated tests, we need more with
|
|
46
|
+
# different keysizes!
|
|
47
|
+
#
|
|
48
|
+
|
|
49
|
+
def misc_tests
|
|
50
|
+
[
|
|
51
|
+
|
|
52
|
+
# a 3 byte key test
|
|
53
|
+
[
|
|
54
|
+
"\x54\x9a\x04\x02\x8f",
|
|
55
|
+
"\x6d\x4b\x3c",
|
|
56
|
+
"9\3218o\304"
|
|
57
|
+
],
|
|
58
|
+
|
|
59
|
+
# a 4 byte key test
|
|
60
|
+
[
|
|
61
|
+
"\312/\216e\265\301\323\026Y\315",
|
|
62
|
+
"m2{b",
|
|
63
|
+
"\247\035\365\a\330\363\250t4\377"
|
|
64
|
+
],
|
|
65
|
+
|
|
66
|
+
# randomly generated 2 byte key tests...
|
|
67
|
+
[
|
|
68
|
+
"\x82\x3f\xb4\x77\x55\x16\x4a\x56\x87\xad\x5b\xf5",
|
|
69
|
+
"\x33\xdb",
|
|
70
|
+
"\xb1\xe4\x87\xac\x66\xcd\x79\x8d\xb4\x76\x68\x2e"
|
|
71
|
+
],
|
|
72
|
+
[
|
|
73
|
+
"\x9c\xbd\xaa\x83\x8d\x7e\x76\xd9\x4b\xb2\x04\xd5\x2b\x58\x66",
|
|
74
|
+
"\xda\x10",
|
|
75
|
+
"\x46\xad\x70\x93\x57\x6e\xac\xc9\x91\xa2\xde\xc5\xf1\x48\xbc"
|
|
76
|
+
],
|
|
77
|
+
[
|
|
78
|
+
"\x7f\x3b\xfb\x3b\xce\x8c\xe8\x3d\x65\x40\x2d\x5a\x19",
|
|
79
|
+
"\x62\x28",
|
|
80
|
+
"\x1d\x13\x99\x13\xac\xa4\x8a\x15\x07\x68\x4f\x72\x7b"
|
|
81
|
+
],
|
|
82
|
+
[
|
|
83
|
+
"\xc8\xab\xa4\x56\xd5\xf0",
|
|
84
|
+
"\x1a\xd0",
|
|
85
|
+
"\xd2\x7b\xbe\x86\xcf\x20"
|
|
86
|
+
],
|
|
87
|
+
[
|
|
88
|
+
"\xcc\x5a\x84\xe0\x6c\x00\x7a\x20\xa0\xc9",
|
|
89
|
+
"\xe6\xb6",
|
|
90
|
+
"\x2a\xec\x62\x56\x8a\xb6\x9c\x96\x46\x7f"
|
|
91
|
+
],
|
|
92
|
+
[
|
|
93
|
+
"\x46\x96\x83\x1f\x6a\x79\xfe\xec\x24\xe0\xc3\x20\xe9\xa5\x3a\x76",
|
|
94
|
+
"\x36\x5e",
|
|
95
|
+
"\x70\xc8\xb5\x41\x5c\x27\xc8\xb2\x12\xbe\xf5\x7e\xdf\xfb\x0c\x28"
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
"\x74\x7c\xe9\x21\x30\x33\xb3\xe6\x77\x9e\x07\xbc\x6c\xee\xc5\x06",
|
|
99
|
+
"\x02\xa0",
|
|
100
|
+
"\x76\xdc\xeb\x81\x32\x93\xb1\x46\x75\x3e\x05\x1c\x6e\x4e\xc7\xa6"
|
|
101
|
+
],
|
|
102
|
+
[
|
|
103
|
+
"\x64\x8c\xc3\x41\x5d\xe5\x18\x36\xda\xc4\x86",
|
|
104
|
+
"\xe3\xb9",
|
|
105
|
+
"\x87\x35\x20\xf8\xbe\x5c\xfb\x8f\x39\x7d\x65"
|
|
106
|
+
],
|
|
107
|
+
[
|
|
108
|
+
"\xdb\xbb\xb2\x7c\xda\x1f\xd6\xa5\x34\x00\xad",
|
|
109
|
+
"\x20\xfc",
|
|
110
|
+
"\xfb\x47\x92\x80\xfa\xe3\xf6\x59\x14\xfc\x8d"
|
|
111
|
+
],
|
|
112
|
+
[
|
|
113
|
+
"\xc1\x2e\xfc\x7b\x98\x41\xec\xe3\x40\x98\x0b\xfd\x2c",
|
|
114
|
+
"\x4a\xd7",
|
|
115
|
+
"\x8b\xf9\xb6\xac\xd2\x96\xa6\x34\x0a\x4f\x41\x2a\x66"
|
|
116
|
+
]
|
|
117
|
+
]
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|