librex 0.0.68 → 0.0.70
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.
- checksums.yaml +15 -0
- data/README.markdown +1 -1
- data/Rakefile +18 -16
- data/lib/rex.rb +14 -10
- data/lib/rex/LICENSE +2 -2
- data/lib/rex/arch.rb +76 -76
- data/lib/rex/arch/sparc.rb +57 -58
- data/lib/rex/arch/x86.rb +506 -496
- data/lib/rex/assembly/nasm.rb +83 -84
- data/lib/rex/compat.rb +228 -173
- data/lib/rex/constants.rb +47 -37
- data/lib/rex/elfparsey.rb +0 -3
- data/lib/rex/elfparsey/elf.rb +107 -110
- data/lib/rex/elfparsey/elfbase.rb +244 -247
- data/lib/rex/elfparsey/exceptions.rb +0 -3
- data/lib/rex/elfscan.rb +0 -3
- data/lib/rex/elfscan/scanner.rb +184 -166
- data/lib/rex/elfscan/search.rb +35 -38
- data/lib/rex/encoder/alpha2.rb +1 -2
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
- data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
- data/lib/rex/encoder/alpha2/generic.rb +77 -78
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
- data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
- data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
- data/lib/rex/encoder/ndr.rb +68 -68
- data/lib/rex/encoder/nonalpha.rb +50 -51
- data/lib/rex/encoder/nonupper.rb +50 -51
- data/lib/rex/encoder/xdr.rb +78 -78
- data/lib/rex/encoder/xor.rb +52 -53
- data/lib/rex/encoder/xor/dword.rb +1 -2
- data/lib/rex/encoder/xor/dword_additive.rb +1 -2
- data/lib/rex/encoders/xor_dword.rb +17 -18
- data/lib/rex/encoders/xor_dword_additive.rb +35 -36
- data/lib/rex/encoding/xor.rb +0 -1
- data/lib/rex/encoding/xor/byte.rb +3 -4
- data/lib/rex/encoding/xor/dword.rb +3 -4
- data/lib/rex/encoding/xor/dword_additive.rb +72 -73
- data/lib/rex/encoding/xor/exceptions.rb +2 -3
- data/lib/rex/encoding/xor/generic.rb +129 -130
- data/lib/rex/encoding/xor/qword.rb +3 -4
- data/lib/rex/encoding/xor/word.rb +3 -4
- data/lib/rex/exceptions.rb +100 -101
- data/lib/rex/exploitation/cmdstager.rb +3 -3
- data/lib/rex/exploitation/cmdstager/base.rb +170 -156
- data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
- data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
- data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
- data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
- data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
- data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
- data/lib/rex/exploitation/egghunter.rb +359 -346
- data/lib/rex/exploitation/encryptjs.rb +60 -60
- data/lib/rex/exploitation/heaplib.rb +76 -76
- data/lib/rex/exploitation/js.rb +6 -0
- data/lib/rex/exploitation/js/detect.rb +69 -0
- data/lib/rex/exploitation/js/memory.rb +81 -0
- data/lib/rex/exploitation/js/network.rb +84 -0
- data/lib/rex/exploitation/js/utils.rb +33 -0
- data/lib/rex/exploitation/jsobfu.rb +448 -424
- data/lib/rex/exploitation/obfuscatejs.rb +301 -301
- data/lib/rex/exploitation/omelet.rb +257 -257
- data/lib/rex/exploitation/opcodedb.rb +699 -699
- data/lib/rex/exploitation/ropdb.rb +189 -0
- data/lib/rex/exploitation/seh.rb +68 -68
- data/lib/rex/file.rb +96 -49
- data/lib/rex/image_source.rb +0 -3
- data/lib/rex/image_source/disk.rb +45 -48
- data/lib/rex/image_source/image_source.rb +33 -36
- data/lib/rex/image_source/memory.rb +17 -20
- data/lib/rex/io/bidirectional_pipe.rb +118 -115
- data/lib/rex/io/datagram_abstraction.rb +13 -14
- data/lib/rex/io/ring_buffer.rb +273 -273
- data/lib/rex/io/stream.rb +284 -284
- data/lib/rex/io/stream_abstraction.rb +183 -181
- data/lib/rex/io/stream_server.rb +193 -193
- data/lib/rex/job_container.rb +167 -167
- data/lib/rex/logging.rb +0 -1
- data/lib/rex/logging/log_dispatcher.rb +113 -113
- data/lib/rex/logging/log_sink.rb +17 -17
- data/lib/rex/logging/sinks/flatfile.rb +36 -36
- data/lib/rex/logging/sinks/stderr.rb +27 -27
- data/lib/rex/mac_oui.rb +16572 -16571
- data/lib/rex/machparsey.rb +0 -1
- data/lib/rex/machparsey/exceptions.rb +0 -1
- data/lib/rex/machparsey/mach.rb +160 -161
- data/lib/rex/machparsey/machbase.rb +367 -368
- data/lib/rex/machscan.rb +0 -1
- data/lib/rex/machscan/scanner.rb +175 -176
- data/lib/rex/mime/encoding.rb +17 -0
- data/lib/rex/mime/header.rb +58 -58
- data/lib/rex/mime/message.rb +140 -137
- data/lib/rex/mime/part.rb +41 -12
- data/lib/rex/nop/opty2.rb +90 -90
- data/lib/rex/nop/opty2_tables.rb +273 -273
- data/lib/rex/ole.rb +0 -4
- data/lib/rex/ole/clsid.rb +26 -30
- data/lib/rex/ole/difat.rb +121 -125
- data/lib/rex/ole/directory.rb +205 -209
- data/lib/rex/ole/direntry.rb +217 -221
- data/lib/rex/ole/fat.rb +79 -83
- data/lib/rex/ole/header.rb +178 -182
- data/lib/rex/ole/minifat.rb +49 -53
- data/lib/rex/ole/propset.rb +113 -117
- data/lib/rex/ole/samples/create_ole.rb +8 -9
- data/lib/rex/ole/samples/dir.rb +10 -11
- data/lib/rex/ole/samples/dump_stream.rb +14 -15
- data/lib/rex/ole/samples/ole_info.rb +5 -6
- data/lib/rex/ole/storage.rb +372 -376
- data/lib/rex/ole/stream.rb +33 -37
- data/lib/rex/ole/substorage.rb +20 -24
- data/lib/rex/ole/util.rb +137 -141
- data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
- data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
- data/lib/rex/parser/appscan_nokogiri.rb +359 -359
- data/lib/rex/parser/arguments.rb +88 -88
- data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
- data/lib/rex/parser/ci_nokogiri.rb +184 -184
- data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
- data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
- data/lib/rex/parser/ini.rb +167 -167
- data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
- data/lib/rex/parser/ip360_xml.rb +77 -77
- data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
- data/lib/rex/parser/nessus_xml.rb +100 -100
- data/lib/rex/parser/netsparker_xml.rb +89 -75
- data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
- data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
- data/lib/rex/parser/nexpose_xml.rb +105 -105
- data/lib/rex/parser/nmap_nokogiri.rb +386 -386
- data/lib/rex/parser/nmap_xml.rb +116 -116
- data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
- data/lib/rex/parser/openvas_nokogiri.rb +162 -162
- data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
- data/lib/rex/parser/retina_xml.rb +90 -90
- data/lib/rex/parser/unattend.rb +171 -0
- data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
- data/lib/rex/payloads/win32/common.rb +14 -14
- data/lib/rex/payloads/win32/kernel.rb +36 -36
- data/lib/rex/payloads/win32/kernel/common.rb +32 -32
- data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
- data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
- data/lib/rex/peparsey.rb +0 -3
- data/lib/rex/peparsey/exceptions.rb +0 -3
- data/lib/rex/peparsey/pe.rb +196 -199
- data/lib/rex/peparsey/pe_memdump.rb +35 -38
- data/lib/rex/peparsey/pebase.rb +1633 -1652
- data/lib/rex/peparsey/section.rb +115 -124
- data/lib/rex/pescan.rb +0 -3
- data/lib/rex/pescan/analyze.rb +351 -351
- data/lib/rex/pescan/scanner.rb +182 -182
- data/lib/rex/pescan/search.rb +59 -59
- data/lib/rex/platforms/windows.rb +37 -37
- data/lib/rex/poly.rb +111 -110
- data/lib/rex/poly/block.rb +419 -417
- data/lib/rex/poly/machine.rb +12 -0
- data/lib/rex/poly/machine/machine.rb +829 -0
- data/lib/rex/poly/machine/x86.rb +508 -0
- data/lib/rex/poly/register.rb +70 -70
- data/lib/rex/poly/register/x86.rb +22 -22
- data/lib/rex/post.rb +0 -1
- data/lib/rex/post/dir.rb +35 -36
- data/lib/rex/post/file.rb +140 -141
- data/lib/rex/post/file_stat.rb +198 -199
- data/lib/rex/post/io.rb +167 -168
- data/lib/rex/post/meterpreter.rb +1 -1
- data/lib/rex/post/meterpreter/channel.rb +389 -390
- data/lib/rex/post/meterpreter/channel_container.rb +33 -34
- data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
- data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
- data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
- data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
- data/lib/rex/post/meterpreter/client.rb +442 -436
- data/lib/rex/post/meterpreter/client_core.rb +326 -310
- data/lib/rex/post/meterpreter/dependencies.rb +0 -1
- data/lib/rex/post/meterpreter/extension.rb +12 -13
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
- data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
- data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
- data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
- data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
- data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
- data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
- data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
- data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
- data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
- data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
- data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
- data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
- data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
- data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
- data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
- data/lib/rex/post/meterpreter/packet.rb +591 -592
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
- data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
- data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
- data/lib/rex/post/meterpreter/ui/console.rb +112 -112
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
- data/lib/rex/post/permission.rb +0 -1
- data/lib/rex/post/process.rb +39 -40
- data/lib/rex/post/thread.rb +41 -42
- data/lib/rex/post/ui.rb +35 -36
- data/lib/rex/proto/addp.rb +218 -0
- data/lib/rex/proto/dcerpc/client.rb +344 -344
- data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
- data/lib/rex/proto/dcerpc/handle.rb +32 -32
- data/lib/rex/proto/dcerpc/ndr.rb +56 -56
- data/lib/rex/proto/dcerpc/packet.rb +249 -245
- data/lib/rex/proto/dcerpc/response.rb +170 -170
- data/lib/rex/proto/dcerpc/uuid.rb +65 -65
- data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
- data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
- data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
- data/lib/rex/proto/dhcp.rb +0 -1
- data/lib/rex/proto/dhcp/constants.rb +0 -1
- data/lib/rex/proto/dhcp/server.rb +303 -304
- data/lib/rex/proto/drda/constants.rb +1 -1
- data/lib/rex/proto/drda/packet.rb +186 -186
- data/lib/rex/proto/drda/utils.rb +104 -104
- data/lib/rex/proto/http.rb +1 -0
- data/lib/rex/proto/http/client.rb +692 -820
- data/lib/rex/proto/http/client_request.rb +472 -0
- data/lib/rex/proto/http/handler.rb +25 -25
- data/lib/rex/proto/http/handler/erb.rb +104 -104
- data/lib/rex/proto/http/handler/proc.rb +37 -37
- data/lib/rex/proto/http/header.rb +149 -149
- data/lib/rex/proto/http/packet.rb +388 -382
- data/lib/rex/proto/http/request.rb +332 -335
- data/lib/rex/proto/http/response.rb +132 -72
- data/lib/rex/proto/http/server.rb +348 -338
- data/lib/rex/proto/iax2/call.rb +310 -310
- data/lib/rex/proto/iax2/client.rb +197 -197
- data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
- data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
- data/lib/rex/proto/ipmi.rb +57 -0
- data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
- data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
- data/lib/rex/proto/ipmi/rakp2.rb +35 -0
- data/lib/rex/proto/ipmi/utils.rb +125 -0
- data/lib/rex/proto/natpmp.rb +1 -5
- data/lib/rex/proto/natpmp/constants.rb +4 -4
- data/lib/rex/proto/natpmp/packet.rb +25 -25
- data/lib/rex/proto/ntlm/base.rb +271 -271
- data/lib/rex/proto/ntlm/constants.rb +61 -61
- data/lib/rex/proto/ntlm/crypt.rb +348 -352
- data/lib/rex/proto/ntlm/exceptions.rb +3 -3
- data/lib/rex/proto/ntlm/message.rb +468 -471
- data/lib/rex/proto/ntlm/utils.rb +746 -746
- data/lib/rex/proto/pjl.rb +30 -0
- data/lib/rex/proto/pjl/client.rb +162 -0
- data/lib/rex/proto/proxy/socks4a.rb +440 -440
- data/lib/rex/proto/rfb.rb +1 -8
- data/lib/rex/proto/rfb/cipher.rb +46 -49
- data/lib/rex/proto/rfb/client.rb +179 -182
- data/lib/rex/proto/rfb/constants.rb +18 -21
- data/lib/rex/proto/smb/client.rb +1954 -1843
- data/lib/rex/proto/smb/constants.rb +533 -516
- data/lib/rex/proto/smb/crypt.rb +21 -21
- data/lib/rex/proto/smb/evasions.rb +43 -43
- data/lib/rex/proto/smb/exceptions.rb +791 -791
- data/lib/rex/proto/smb/simpleclient.rb +142 -286
- data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
- data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
- data/lib/rex/proto/smb/utils.rb +81 -81
- data/lib/rex/proto/sunrpc/client.rb +158 -158
- data/lib/rex/proto/tftp.rb +0 -1
- data/lib/rex/proto/tftp/client.rb +289 -289
- data/lib/rex/proto/tftp/constants.rb +9 -10
- data/lib/rex/proto/tftp/server.rb +466 -467
- data/lib/rex/random_identifier_generator.rb +176 -0
- data/lib/rex/registry.rb +1 -1
- data/lib/rex/registry/hive.rb +88 -88
- data/lib/rex/registry/lfkey.rb +25 -25
- data/lib/rex/registry/nodekey.rb +30 -30
- data/lib/rex/registry/regf.rb +10 -10
- data/lib/rex/registry/valuekey.rb +43 -43
- data/lib/rex/registry/valuelist.rb +13 -13
- data/lib/rex/ropbuilder/rop.rb +254 -253
- data/lib/rex/script.rb +21 -22
- data/lib/rex/script/base.rb +51 -50
- data/lib/rex/script/meterpreter.rb +2 -2
- data/lib/rex/service.rb +24 -24
- data/lib/rex/service_manager.rb +132 -132
- data/lib/rex/services/local_relay.rb +398 -398
- data/lib/rex/socket.rb +758 -763
- data/lib/rex/socket/comm.rb +95 -95
- data/lib/rex/socket/comm/local.rb +507 -440
- data/lib/rex/socket/ip.rb +118 -118
- data/lib/rex/socket/parameters.rb +351 -350
- data/lib/rex/socket/range_walker.rb +445 -368
- data/lib/rex/socket/ssl_tcp.rb +323 -317
- data/lib/rex/socket/ssl_tcp_server.rb +173 -158
- data/lib/rex/socket/subnet_walker.rb +48 -48
- data/lib/rex/socket/switch_board.rb +259 -259
- data/lib/rex/socket/tcp.rb +58 -56
- data/lib/rex/socket/tcp_server.rb +42 -42
- data/lib/rex/socket/udp.rb +152 -152
- data/lib/rex/sslscan/result.rb +200 -0
- data/lib/rex/sslscan/scanner.rb +205 -0
- data/lib/rex/struct2.rb +0 -1
- data/lib/rex/struct2/c_struct.rb +162 -163
- data/lib/rex/struct2/c_struct_template.rb +21 -22
- data/lib/rex/struct2/constant.rb +6 -7
- data/lib/rex/struct2/element.rb +30 -31
- data/lib/rex/struct2/generic.rb +60 -61
- data/lib/rex/struct2/restraint.rb +40 -41
- data/lib/rex/struct2/s_string.rb +60 -61
- data/lib/rex/struct2/s_struct.rb +97 -98
- data/lib/rex/sync.rb +0 -1
- data/lib/rex/sync/event.rb +62 -72
- data/lib/rex/sync/read_write_lock.rb +149 -149
- data/lib/rex/sync/ref.rb +42 -42
- data/lib/rex/sync/thread_safe.rb +59 -59
- data/lib/rex/text.rb +1803 -1315
- data/lib/rex/thread_factory.rb +25 -25
- data/lib/rex/time.rb +44 -44
- data/lib/rex/transformer.rb +91 -91
- data/lib/rex/ui/interactive.rb +265 -265
- data/lib/rex/ui/output.rb +66 -60
- data/lib/rex/ui/progress_tracker.rb +79 -79
- data/lib/rex/ui/subscriber.rb +144 -134
- data/lib/rex/ui/text/color.rb +76 -76
- data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
- data/lib/rex/ui/text/input.rb +96 -96
- data/lib/rex/ui/text/input/buffer.rb +58 -58
- data/lib/rex/ui/text/input/readline.rb +114 -114
- data/lib/rex/ui/text/input/socket.rb +77 -77
- data/lib/rex/ui/text/input/stdio.rb +24 -24
- data/lib/rex/ui/text/irb_shell.rb +45 -41
- data/lib/rex/ui/text/output.rb +64 -60
- data/lib/rex/ui/text/output/buffer.rb +42 -42
- data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
- data/lib/rex/ui/text/output/file.rb +24 -24
- data/lib/rex/ui/text/output/socket.rb +24 -24
- data/lib/rex/ui/text/output/stdio.rb +29 -29
- data/lib/rex/ui/text/output/tee.rb +36 -36
- data/lib/rex/ui/text/progress_tracker.rb +37 -37
- data/lib/rex/ui/text/shell.rb +371 -361
- data/lib/rex/ui/text/table.rb +320 -284
- data/lib/rex/zip.rb +0 -1
- data/lib/rex/zip/archive.rb +115 -94
- data/lib/rex/zip/blocks.rb +101 -100
- data/lib/rex/zip/entry.rb +108 -99
- data/lib/rex/zip/jar.rb +261 -206
- data/lib/rex/zip/samples/comment.rb +1 -2
- data/lib/rex/zip/samples/mkwar.rb +12 -13
- data/lib/rex/zip/samples/mkzip.rb +1 -2
- data/lib/rex/zip/samples/recursive.rb +29 -30
- metadata +424 -446
- data/lib/rex/arch/sparc.rb.ut.rb +0 -19
- data/lib/rex/arch/x86.rb.ut.rb +0 -94
- data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
- data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
- data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
- data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
- data/lib/rex/encoding/xor.rb.ts.rb +0 -15
- data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
- data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
- data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
- data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
- data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
- data/lib/rex/exceptions.rb.ut.rb +0 -45
- data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
- data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
- data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
- data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
- data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
- data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
- data/lib/rex/file.rb.ut.rb +0 -17
- data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
- data/lib/rex/nop/opty2.rb.ut.rb +0 -24
- data/lib/rex/parser/arguments.rb.ut.rb +0 -68
- data/lib/rex/parser/ini.rb.ut.rb +0 -30
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
- data/lib/rex/proto.rb.ts.rb +0 -9
- data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
- data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
- data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
- data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
- data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
- data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
- data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
- data/lib/rex/proto/drda.rb.ts.rb +0 -18
- data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
- data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
- data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
- data/lib/rex/proto/http.rb.ts.rb +0 -13
- data/lib/rex/proto/http/client.rb.ut.rb +0 -96
- data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
- data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
- data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
- data/lib/rex/proto/http/header.rb.ut.rb +0 -47
- data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
- data/lib/rex/proto/http/request.rb.ut.rb +0 -215
- data/lib/rex/proto/http/response.rb.ut.rb +0 -150
- data/lib/rex/proto/http/server.rb.ut.rb +0 -80
- data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
- data/lib/rex/proto/rfb.rb.ut.rb +0 -40
- data/lib/rex/proto/smb.rb.ts.rb +0 -9
- data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
- data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
- data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
- data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
- data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
- data/lib/rex/service_manager.rb.ut.rb +0 -33
- data/lib/rex/socket.rb.ut.rb +0 -108
- data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
- data/lib/rex/socket/parameters.rb.ut.rb +0 -52
- data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
- data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
- data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
- data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
- data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
- data/lib/rex/socket/tcp.rb.ut.rb +0 -65
- data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
- data/lib/rex/socket/udp.rb.ut.rb +0 -45
- data/lib/rex/test.rb +0 -36
- data/lib/rex/text.rb.ut.rb +0 -193
- data/lib/rex/transformer.rb.ut.rb +0 -39
- data/lib/rex/ui/text/color.rb.ut.rb +0 -19
- data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
- data/lib/rex/ui/text/table.rb.ut.rb +0 -56
|
@@ -8,45 +8,45 @@ module Windows
|
|
|
8
8
|
#
|
|
9
9
|
# Windows Registry Constants
|
|
10
10
|
#
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
REG_NONE = 1
|
|
12
|
+
REG_SZ = 1
|
|
13
|
+
REG_EXPAND_SZ = 2
|
|
14
|
+
REG_BINARY = 3
|
|
15
|
+
REG_DWORD = 4
|
|
16
|
+
REG_LITTLE_ENDIAN = 4
|
|
17
|
+
REG_BIG_ENDIAN = 5
|
|
18
|
+
REG_LINK = 6
|
|
19
|
+
REG_MULTI_SZ = 7
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
HKEY_CLASSES_ROOT = 0x80000000
|
|
22
|
+
HKEY_CURRENT_USER = 0x80000001
|
|
23
|
+
HKEY_LOCAL_MACHINE = 0x80000002
|
|
24
|
+
HKEY_USERS = 0x80000003
|
|
25
|
+
HKEY_PERFORMANCE_DATA = 0x80000004
|
|
26
|
+
HKEY_CURRENT_CONFIG = 0x80000005
|
|
27
|
+
HKEY_DYN_DATA = 0x80000006
|
|
28
|
+
|
|
29
|
+
def registry_hive_lookup(hive)
|
|
30
|
+
case hive
|
|
31
|
+
when 'HKCR'
|
|
32
|
+
HKEY_LOCAL_MACHINE
|
|
33
|
+
when 'HKCU'
|
|
34
|
+
HKEY_CURRENT_USER
|
|
35
|
+
when 'HKLM'
|
|
36
|
+
HKEY_LOCAL_MACHINE
|
|
37
|
+
when 'HKU'
|
|
38
|
+
HKEY_USERS
|
|
39
|
+
when 'HKPD'
|
|
40
|
+
HKEY_PERFORMANCE_DATA
|
|
41
|
+
when 'HKCC'
|
|
42
|
+
HKEY_CURRENT_CONFIG
|
|
43
|
+
when 'HKDD'
|
|
44
|
+
HKEY_DYN_DATA
|
|
45
|
+
else
|
|
46
|
+
HKEY_LOCAL_MACHINE
|
|
47
|
+
end
|
|
48
|
+
end
|
|
28
49
|
|
|
29
|
-
def registry_hive_lookup(hive)
|
|
30
|
-
case hive
|
|
31
|
-
when 'HKCR'
|
|
32
|
-
HKEY_LOCAL_MACHINE
|
|
33
|
-
when 'HKCU'
|
|
34
|
-
HKEY_CURRENT_USER
|
|
35
|
-
when 'HKLM'
|
|
36
|
-
HKEY_LOCAL_MACHINE
|
|
37
|
-
when 'HKU'
|
|
38
|
-
HKEY_USERS
|
|
39
|
-
when 'HKPD'
|
|
40
|
-
HKEY_PERFORMANCE_DATA
|
|
41
|
-
when 'HKCC'
|
|
42
|
-
HKEY_CURRENT_CONFIG
|
|
43
|
-
when 'HKDD'
|
|
44
|
-
HKEY_DYN_DATA
|
|
45
|
-
else
|
|
46
|
-
HKEY_LOCAL_MACHINE
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
52
|
end
|
data/lib/rex/poly.rb
CHANGED
|
@@ -4,6 +4,7 @@ module Poly
|
|
|
4
4
|
|
|
5
5
|
require 'rex/poly/register'
|
|
6
6
|
require 'rex/poly/block'
|
|
7
|
+
require 'rex/poly/machine'
|
|
7
8
|
|
|
8
9
|
###
|
|
9
10
|
#
|
|
@@ -16,116 +17,116 @@ require 'rex/poly/block'
|
|
|
16
17
|
###
|
|
17
18
|
class State
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
20
|
+
#
|
|
21
|
+
# Initializes the polymorphic generation state.
|
|
22
|
+
#
|
|
23
|
+
def initialize
|
|
24
|
+
@block_list = nil
|
|
25
|
+
reset
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Resets the generation state to have a plain start by clearing all
|
|
30
|
+
# consumed registers, resetting the polymorphic buffer back to its
|
|
31
|
+
# beginning and destroying any block generation state.
|
|
32
|
+
#
|
|
33
|
+
def reset
|
|
34
|
+
# Reset the generation flag on any blocks in the block list
|
|
35
|
+
@block_list.each { |block|
|
|
36
|
+
block[0].generated = false
|
|
37
|
+
} if (@block_list)
|
|
38
|
+
|
|
39
|
+
@regnums = Hash.new
|
|
40
|
+
@buffer = ''
|
|
41
|
+
@block_list = []
|
|
42
|
+
@curr_offset = 0
|
|
43
|
+
@first_phase = true
|
|
44
|
+
@badchars = nil
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# Returns true if the supplied register number is already consumed.
|
|
49
|
+
#
|
|
50
|
+
def consumed_regnum?(regnum)
|
|
51
|
+
@regnums[regnum]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# Consumes a register number, thus removing it from the pool that can be
|
|
56
|
+
# assigned. The consumed register number is returned to the caller.
|
|
57
|
+
#
|
|
58
|
+
def consume_regnum(regnum)
|
|
59
|
+
raise RuntimeError, "Register #{regnum} is already consumed." if (consumed_regnum?(regnum))
|
|
60
|
+
|
|
61
|
+
@regnums[regnum] = true
|
|
62
|
+
|
|
63
|
+
regnum
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# Acquires a register number that has not already been consumed from the
|
|
68
|
+
# supplied register number set and consumes it, returning the selected
|
|
69
|
+
# register number to the caller. The register number is selected from the
|
|
70
|
+
# set at random.
|
|
71
|
+
#
|
|
72
|
+
def consume_regnum_from_set(regnum_set)
|
|
73
|
+
# Pick a random starting point within the supplied set.
|
|
74
|
+
idx = rand(regnum_set.length)
|
|
75
|
+
|
|
76
|
+
# Try each index in the set.
|
|
77
|
+
regnum_set.length.times { |x|
|
|
78
|
+
regnum = regnum_set[(idx + x) % regnum_set.length]
|
|
79
|
+
|
|
80
|
+
next if (consumed_regnum?(regnum))
|
|
81
|
+
|
|
82
|
+
return consume_regnum(regnum)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# If we get through the entire iteration without finding a register,
|
|
86
|
+
# then we are out of registers to assign.
|
|
87
|
+
raise RuntimeError, "No registers are available to consume from the set"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# Eliminates a register number from the consumed pool so that it can be
|
|
92
|
+
# used in the future. This happens after a block indicates that a register
|
|
93
|
+
# has been clobbered.
|
|
94
|
+
#
|
|
95
|
+
def defecate_regnum(regnum)
|
|
96
|
+
@regnums.delete(regnum)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# The buffer state for the current polymorphic generation. This stores the
|
|
101
|
+
# end-result of a call to generate on a LogicalBlock.
|
|
102
|
+
#
|
|
103
|
+
attr_accessor :buffer
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# The linear list of blocks that is generated by calling the generate
|
|
107
|
+
# method on a LogicalBlock.
|
|
108
|
+
#
|
|
109
|
+
attr_accessor :block_list
|
|
110
|
+
|
|
111
|
+
#
|
|
112
|
+
# The current offset into the polymorphic buffer that is being generated.
|
|
113
|
+
# This is updated as blocks are appended to the block_list.
|
|
114
|
+
#
|
|
115
|
+
attr_accessor :curr_offset
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# A boolean field that is used by the LogicalBlock class to track whether
|
|
119
|
+
# or not it is in the first phase (generating the block list), or in the
|
|
120
|
+
# second phase (generating the polymorphic buffer). This phases are used
|
|
121
|
+
# to indicate whether or not the offset_of and regnum_of methods will
|
|
122
|
+
# return actual results.
|
|
123
|
+
#
|
|
124
|
+
attr_accessor :first_phase
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# Characters to avoid when selecting permutations, if any.
|
|
128
|
+
#
|
|
129
|
+
attr_accessor :badchars
|
|
129
130
|
|
|
130
131
|
end
|
|
131
132
|
|
data/lib/rex/poly/block.rb
CHANGED
|
@@ -14,35 +14,35 @@ module Poly
|
|
|
14
14
|
###
|
|
15
15
|
class Permutation
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
17
|
+
#
|
|
18
|
+
# Initializes the permutation and its associated block.
|
|
19
|
+
#
|
|
20
|
+
def initialize(perm, block)
|
|
21
|
+
@perm = perm
|
|
22
|
+
@block = block
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Returns the length of the string returned by to_s.
|
|
27
|
+
#
|
|
28
|
+
def length
|
|
29
|
+
to_s.length
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# Returns the string representation of the permutation. If the underlying
|
|
34
|
+
# permutation is a procedure, the procedure is called. Otherwise, the
|
|
35
|
+
# string representation of the permutation is returned.
|
|
36
|
+
#
|
|
37
|
+
def to_s
|
|
38
|
+
if (@perm.kind_of?(Proc))
|
|
39
|
+
@perm.call(@block).to_s
|
|
40
|
+
else
|
|
41
|
+
@perm.to_s
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
attr_reader :perm
|
|
46
46
|
|
|
47
47
|
end
|
|
48
48
|
|
|
@@ -69,387 +69,389 @@ end
|
|
|
69
69
|
###
|
|
70
70
|
class LogicalBlock
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
72
|
+
#
|
|
73
|
+
# Initializes the logical block's name along with zero or more specific
|
|
74
|
+
# blocks.
|
|
75
|
+
#
|
|
76
|
+
def initialize(name, *perms)
|
|
77
|
+
@name = name
|
|
78
|
+
|
|
79
|
+
reset
|
|
80
|
+
|
|
81
|
+
add_perm(*perms)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
#
|
|
85
|
+
# Resets the block back to its starting point.
|
|
86
|
+
#
|
|
87
|
+
def reset
|
|
88
|
+
@perms = []
|
|
89
|
+
@depends = []
|
|
90
|
+
@next_blocks = []
|
|
91
|
+
@clobbers = []
|
|
92
|
+
@offset = nil
|
|
93
|
+
@state = nil
|
|
94
|
+
@once = false
|
|
95
|
+
@references = 0
|
|
96
|
+
@used_references = 0
|
|
97
|
+
@generated = false
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
#
|
|
101
|
+
# Returns the block's name.
|
|
102
|
+
#
|
|
103
|
+
def name
|
|
104
|
+
@name
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# Flags whether or not the block should only be generated once. This can
|
|
109
|
+
# be used to mark a blog as being depended upon by multiple blocks, but
|
|
110
|
+
# making it such that it is only generated once.
|
|
111
|
+
#
|
|
112
|
+
def once=(tf)
|
|
113
|
+
@once = tf
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
#
|
|
117
|
+
# Returns true if this block is a 'once' block. That is, this block is
|
|
118
|
+
# dependend upon by multiple blocks but should only be generated once.
|
|
119
|
+
#
|
|
120
|
+
def once
|
|
121
|
+
@once
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Increments the number of blocks that depend on this block.
|
|
126
|
+
#
|
|
127
|
+
# @see #deref
|
|
128
|
+
def ref
|
|
129
|
+
@references += 1
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
#
|
|
133
|
+
# Increments the number of blocks that have completed their dependency
|
|
134
|
+
# pass on this block. This number should never become higher than the
|
|
135
|
+
# `@references` attribute.
|
|
136
|
+
#
|
|
137
|
+
# @see #ref
|
|
138
|
+
def deref
|
|
139
|
+
@used_references += 1
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# Returns true if there is only one block reference remaining.
|
|
144
|
+
#
|
|
145
|
+
def last_reference?
|
|
146
|
+
(@references - @used_references <= 0)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
#
|
|
150
|
+
# Adds zero or more specific permutations that may be represented either as
|
|
151
|
+
# strings or as Proc's to be called at evaluation time.
|
|
152
|
+
#
|
|
153
|
+
def add_perm(*perms)
|
|
154
|
+
@perms.concat(perms)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
#
|
|
158
|
+
# Returns a random permutation that is encapsulated in a Permutation class
|
|
159
|
+
# instance.
|
|
160
|
+
#
|
|
161
|
+
def rand_perm
|
|
162
|
+
perm = nil
|
|
163
|
+
|
|
164
|
+
if (@state.badchars)
|
|
165
|
+
perm = rand_perm_badchars
|
|
166
|
+
else
|
|
167
|
+
perm = Permutation.new(@perms[rand(@perms.length)], self)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
if (perm.nil?)
|
|
171
|
+
raise RuntimeError, "Failed to locate a valid permutation."
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
perm
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# Returns a random permutation that passes any necessary bad character
|
|
179
|
+
# checks.
|
|
180
|
+
#
|
|
181
|
+
def rand_perm_badchars
|
|
182
|
+
idx = rand(@perms.length)
|
|
183
|
+
off = 0
|
|
184
|
+
|
|
185
|
+
while (off < @perms.length)
|
|
186
|
+
p = @perms[(idx + off) % @perms.length]
|
|
187
|
+
|
|
188
|
+
if (p.kind_of?(Proc) or
|
|
189
|
+
@state.badchars.nil? or
|
|
190
|
+
Rex::Text.badchar_index(p, @state.badchars).nil?)
|
|
191
|
+
return Permutation.new(p, self)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
off += 1
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
#
|
|
199
|
+
# Sets the blocks that this block instance depends on.
|
|
200
|
+
#
|
|
201
|
+
def depends_on(*depends)
|
|
202
|
+
@depends = depends.dup
|
|
203
|
+
|
|
204
|
+
# Increment dependent references
|
|
205
|
+
@depends.each { |b| b.ref }
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
#
|
|
209
|
+
# Defines the next blocks, but not in a dependency fashion but rather in a
|
|
210
|
+
# linking of separate block contexts.
|
|
211
|
+
#
|
|
212
|
+
def next_blocks(*blocks)
|
|
213
|
+
@next_blocks = blocks.dup
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
#
|
|
217
|
+
# Defines the list of zero or more LogicalRegister's that this block
|
|
218
|
+
# clobbers.
|
|
219
|
+
#
|
|
220
|
+
def clobbers(*registers)
|
|
221
|
+
@clobbers = registers
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
#
|
|
225
|
+
# Enumerates each register instance that is clobbered by this block.
|
|
226
|
+
#
|
|
227
|
+
def each_clobbers(&block)
|
|
228
|
+
@clobbers.each(&block)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# Generates the polymorphic buffer that results from this block and any of
|
|
233
|
+
# the blocks that it either directly or indirectly depends on. A list of
|
|
234
|
+
# register numbers to be saved can be passed in as an argument.
|
|
235
|
+
#
|
|
236
|
+
# This method is not thread safe. To call this method on a single block
|
|
237
|
+
# instance from within multiple threads, be sure to encapsulate the calls
|
|
238
|
+
# inside a locked context.
|
|
239
|
+
#
|
|
240
|
+
def generate(save_registers = nil, state = nil, badchars = nil)
|
|
241
|
+
# Create a localized state instance if one was not supplied.
|
|
242
|
+
state = Rex::Poly::State.new if (state == nil)
|
|
243
|
+
buf = nil
|
|
244
|
+
cnt = 0
|
|
245
|
+
|
|
246
|
+
# This is a lame way of doing this. We just try to generate at most 128
|
|
247
|
+
# times until we don't have badchars. The reason we have to do it this
|
|
248
|
+
# way is because of the fact that badchars can be introduced through
|
|
249
|
+
# block offsetting and register number selection which can't be readily
|
|
250
|
+
# predicted or detected during the generation phase. In the future we
|
|
251
|
+
# can make this better, but for now this will have to do.
|
|
252
|
+
begin
|
|
253
|
+
buf = do_generate(save_registers, state, badchars)
|
|
254
|
+
|
|
255
|
+
if (buf and
|
|
256
|
+
(badchars.nil? or Rex::Text.badchar_index(buf, badchars).nil?))
|
|
257
|
+
break
|
|
258
|
+
end
|
|
259
|
+
end while ((cnt += 1) < 128)
|
|
260
|
+
|
|
261
|
+
# If we passed 128 tries, then we can't succeed.
|
|
262
|
+
buf = nil if (cnt >= 128)
|
|
263
|
+
|
|
264
|
+
buf
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
#
|
|
268
|
+
# Returns the offset of a block. If the active state for this instance is
|
|
269
|
+
# operating in the first phase, then zero is always returned. Otherwise,
|
|
270
|
+
# the correct offset for the supplied block is returned.
|
|
271
|
+
#
|
|
272
|
+
def offset_of(lblock)
|
|
273
|
+
if (@state.first_phase)
|
|
274
|
+
0
|
|
275
|
+
else
|
|
276
|
+
if (lblock.kind_of?(SymbolicBlock::End))
|
|
277
|
+
@state.curr_offset
|
|
278
|
+
else
|
|
279
|
+
lblock.offset
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
#
|
|
285
|
+
# Returns the register number associated with the supplied LogicalRegister
|
|
286
|
+
# instance. If the active state for this instance is operating in the
|
|
287
|
+
# first phase, then zero is always returned. Otherwise, the correct
|
|
288
|
+
# register number is returned based on what is currently assigned to the
|
|
289
|
+
# supplied LogicalRegister instance, if anything.
|
|
290
|
+
#
|
|
291
|
+
def regnum_of(reg)
|
|
292
|
+
(@state.first_phase) ? 0 : reg.regnum
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def size_of(lblock)
|
|
296
|
+
@state.block_list.map { |b, p|
|
|
297
|
+
if b == lblock
|
|
298
|
+
return p.length
|
|
299
|
+
end
|
|
300
|
+
}
|
|
301
|
+
0
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
#
|
|
305
|
+
# This attributes contains the currently assigned offset of the permutation
|
|
306
|
+
# associated with this block into the polymorphic buffer that is being
|
|
307
|
+
# generated.
|
|
308
|
+
#
|
|
309
|
+
attr_accessor :offset
|
|
310
|
+
|
|
311
|
+
#
|
|
312
|
+
# Whether or not this block has currently been generated for a given
|
|
313
|
+
# iteration.
|
|
314
|
+
#
|
|
315
|
+
attr_accessor :generated
|
|
314
316
|
|
|
315
317
|
protected
|
|
316
318
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
319
|
+
#
|
|
320
|
+
# Performs the actual polymorphic buffer generation. Called from generate
|
|
321
|
+
#
|
|
322
|
+
def do_generate(save_registers, state, badchars)
|
|
323
|
+
# Reset the state in case it was passed in.
|
|
324
|
+
state.reset
|
|
325
|
+
|
|
326
|
+
# Set the bad character list
|
|
327
|
+
state.badchars = badchars if (badchars)
|
|
328
|
+
|
|
329
|
+
# Consume any registers that should be saved.
|
|
330
|
+
save_registers.each { |reg|
|
|
331
|
+
state.consume_regnum(reg)
|
|
332
|
+
} if (save_registers)
|
|
333
|
+
|
|
334
|
+
# Build the linear list of blocks that will be processed. This
|
|
335
|
+
# list is built in a dynamic fashion based on block dependencies.
|
|
336
|
+
# The list that is returned is an Array of which each element is a two
|
|
337
|
+
# member array, the first element being the LogicalBlock instance that
|
|
338
|
+
# the permutation came from and the second being an instance of the
|
|
339
|
+
# Permutation class associated with the selected permutation.
|
|
340
|
+
block_list = generate_block_list(state)
|
|
341
|
+
|
|
342
|
+
# Transition into the second phase which enables offset_of and regnum_of
|
|
343
|
+
# calls to return real values.
|
|
344
|
+
state.first_phase = false
|
|
345
|
+
|
|
346
|
+
# Now that every block has been assigned an offset, generate the
|
|
347
|
+
# buffer block by block, assigning registers as necessary.
|
|
348
|
+
block_list.each { |b|
|
|
349
|
+
|
|
350
|
+
# Generate the next permutation and append it to the buffer.
|
|
351
|
+
begin
|
|
352
|
+
state.buffer += b[1].to_s
|
|
353
|
+
# If an invalid register exception is raised, try to consume a random
|
|
354
|
+
# register from the register's associated architecture register
|
|
355
|
+
# number set.
|
|
356
|
+
rescue InvalidRegisterError => e
|
|
357
|
+
e.reg.regnum = state.consume_regnum_from_set(e.reg.class.regnum_set)
|
|
358
|
+
retry
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
# Remove any of the registers that have been clobbered by this block
|
|
362
|
+
# from the list of consumed register numbers so that they can be used
|
|
363
|
+
# in the future.
|
|
364
|
+
b[0].each_clobbers { |reg|
|
|
365
|
+
begin
|
|
366
|
+
state.defecate_regnum(reg.regnum)
|
|
367
|
+
|
|
368
|
+
reg.regnum = nil
|
|
369
|
+
rescue InvalidRegisterError
|
|
370
|
+
end
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
# Finally, return the buffer that has been created.
|
|
376
|
+
state.buffer
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
#
|
|
380
|
+
# Generates the linear list of block permutations which is stored in the
|
|
381
|
+
# supplied state instance. This is done prior to assigning blocks offsets
|
|
382
|
+
#
|
|
383
|
+
def generate_block_list(state, level=0)
|
|
384
|
+
if @depends.length > 1
|
|
385
|
+
@depends.length.times {
|
|
386
|
+
f = rand(@depends.length)
|
|
387
|
+
@depends.push(@depends.delete_at(f))
|
|
388
|
+
}
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
@depends.length.times { |cidx|
|
|
392
|
+
|
|
393
|
+
pass = false
|
|
394
|
+
|
|
395
|
+
while (not pass)
|
|
396
|
+
|
|
397
|
+
if (@depends[cidx].generated)
|
|
398
|
+
break
|
|
399
|
+
|
|
400
|
+
# If this dependent block is a once block and the magic 8 ball turns
|
|
401
|
+
# up zero, skip it and let a later block pick it up. We only do this
|
|
402
|
+
# if we are not the last block to have a dependency on this block.
|
|
403
|
+
elsif ((@depends[cidx].once) and
|
|
404
|
+
(rand(2).to_i == 0) and
|
|
405
|
+
(@depends[cidx].last_reference? == false))
|
|
406
|
+
break
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
# Generate this block
|
|
410
|
+
@depends[cidx].generate_block_list(state, level+1)
|
|
411
|
+
|
|
412
|
+
if level != 0
|
|
413
|
+
return
|
|
414
|
+
else
|
|
415
|
+
@depends.length.times {
|
|
416
|
+
f = rand(@depends.length)
|
|
417
|
+
@depends.push(@depends.delete_at(f))
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
next
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
next
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
self.deref
|
|
428
|
+
|
|
429
|
+
# Assign the instance local state for the duration of this generation
|
|
430
|
+
@state = state
|
|
431
|
+
|
|
432
|
+
# Select a random permutation
|
|
433
|
+
perm = rand_perm
|
|
434
|
+
|
|
435
|
+
# Set our block offset to the current state offset
|
|
436
|
+
self.offset = state.curr_offset
|
|
437
|
+
|
|
438
|
+
# Flag ourselves as having been generated for this iteration.
|
|
439
|
+
self.generated = true
|
|
440
|
+
|
|
441
|
+
# Adjust the current offset based on the permutations length
|
|
442
|
+
state.curr_offset += perm.length
|
|
443
|
+
|
|
444
|
+
# Add it to the linear list of blocks
|
|
445
|
+
state.block_list << [ self, perm ]
|
|
446
|
+
|
|
447
|
+
# Generate all the blocks that follow this one.
|
|
448
|
+
@next_blocks.each { |b|
|
|
449
|
+
b.generate_block_list(state)
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
# Return the state's block list
|
|
453
|
+
state.block_list
|
|
454
|
+
end
|
|
453
455
|
|
|
454
456
|
end
|
|
455
457
|
|
|
@@ -462,16 +464,16 @@ end
|
|
|
462
464
|
###
|
|
463
465
|
module SymbolicBlock
|
|
464
466
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
467
|
+
###
|
|
468
|
+
#
|
|
469
|
+
# The symbolic end of a polymorphic buffer.
|
|
470
|
+
#
|
|
471
|
+
###
|
|
472
|
+
class End < LogicalBlock
|
|
473
|
+
def initialize
|
|
474
|
+
super('__SYMBLK_END__')
|
|
475
|
+
end
|
|
476
|
+
end
|
|
475
477
|
end
|
|
476
478
|
|
|
477
479
|
end
|