dstruct 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.
- checksums.yaml +15 -0
- data/README.markdown +23 -0
- data/examples/smb_example.rb +35 -0
- data/lib/rex.rb +108 -0
- data/lib/rex/LICENSE +29 -0
- data/lib/rex/arch.rb +104 -0
- data/lib/rex/arch/sparc.rb +75 -0
- data/lib/rex/arch/x86.rb +524 -0
- data/lib/rex/assembly/nasm.rb +104 -0
- data/lib/rex/codepage.map +104 -0
- data/lib/rex/compat.rb +389 -0
- data/lib/rex/constants.rb +124 -0
- data/lib/rex/elfparsey.rb +9 -0
- data/lib/rex/elfparsey/elf.rb +121 -0
- data/lib/rex/elfparsey/elfbase.rb +256 -0
- data/lib/rex/elfparsey/exceptions.rb +25 -0
- data/lib/rex/elfscan.rb +10 -0
- data/lib/rex/elfscan/scanner.rb +226 -0
- data/lib/rex/elfscan/search.rb +44 -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 +90 -0
- data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
- data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
- data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
- data/lib/rex/encoder/ndr.rb +90 -0
- data/lib/rex/encoder/nonalpha.rb +61 -0
- data/lib/rex/encoder/nonupper.rb +64 -0
- data/lib/rex/encoder/xdr.rb +107 -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/encoding/xor.rb +20 -0
- data/lib/rex/encoding/xor/byte.rb +15 -0
- data/lib/rex/encoding/xor/dword.rb +21 -0
- data/lib/rex/encoding/xor/dword_additive.rb +92 -0
- data/lib/rex/encoding/xor/exceptions.rb +17 -0
- data/lib/rex/encoding/xor/generic.rb +146 -0
- data/lib/rex/encoding/xor/qword.rb +15 -0
- data/lib/rex/encoding/xor/word.rb +21 -0
- data/lib/rex/exceptions.rb +275 -0
- data/lib/rex/exploitation/cmdstager.rb +10 -0
- data/lib/rex/exploitation/cmdstager/base.rb +190 -0
- data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
- data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
- data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
- 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 +71 -0
- data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
- data/lib/rex/exploitation/egghunter.rb +425 -0
- data/lib/rex/exploitation/encryptjs.rb +78 -0
- data/lib/rex/exploitation/heaplib.js.b64 +331 -0
- data/lib/rex/exploitation/heaplib.rb +107 -0
- 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 +513 -0
- data/lib/rex/exploitation/obfuscatejs.rb +336 -0
- data/lib/rex/exploitation/omelet.rb +321 -0
- data/lib/rex/exploitation/opcodedb.rb +819 -0
- data/lib/rex/exploitation/powershell.rb +62 -0
- data/lib/rex/exploitation/powershell/function.rb +63 -0
- data/lib/rex/exploitation/powershell/obfu.rb +98 -0
- data/lib/rex/exploitation/powershell/output.rb +151 -0
- data/lib/rex/exploitation/powershell/param.rb +23 -0
- data/lib/rex/exploitation/powershell/parser.rb +183 -0
- data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
- data/lib/rex/exploitation/powershell/script.rb +99 -0
- data/lib/rex/exploitation/ropdb.rb +190 -0
- data/lib/rex/exploitation/seh.rb +93 -0
- data/lib/rex/file.rb +160 -0
- data/lib/rex/image_source.rb +10 -0
- data/lib/rex/image_source/disk.rb +58 -0
- data/lib/rex/image_source/image_source.rb +44 -0
- data/lib/rex/image_source/memory.rb +35 -0
- data/lib/rex/io/bidirectional_pipe.rb +161 -0
- data/lib/rex/io/datagram_abstraction.rb +35 -0
- data/lib/rex/io/ring_buffer.rb +369 -0
- data/lib/rex/io/stream.rb +312 -0
- data/lib/rex/io/stream_abstraction.rb +209 -0
- data/lib/rex/io/stream_server.rb +221 -0
- data/lib/rex/job_container.rb +200 -0
- data/lib/rex/logging.rb +4 -0
- data/lib/rex/logging/log_dispatcher.rb +180 -0
- data/lib/rex/logging/log_sink.rb +43 -0
- data/lib/rex/logging/sinks/flatfile.rb +56 -0
- data/lib/rex/logging/sinks/stderr.rb +44 -0
- data/lib/rex/mac_oui.rb +16581 -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 +10 -0
- data/lib/rex/mime/encoding.rb +17 -0
- data/lib/rex/mime/header.rb +78 -0
- data/lib/rex/mime/message.rb +150 -0
- data/lib/rex/mime/part.rb +50 -0
- data/lib/rex/nop/opty2.rb +109 -0
- data/lib/rex/nop/opty2_tables.rb +301 -0
- data/lib/rex/ole.rb +202 -0
- data/lib/rex/ole/clsid.rb +44 -0
- data/lib/rex/ole/difat.rb +138 -0
- data/lib/rex/ole/directory.rb +228 -0
- data/lib/rex/ole/direntry.rb +237 -0
- data/lib/rex/ole/docs/dependencies.txt +8 -0
- data/lib/rex/ole/docs/references.txt +1 -0
- data/lib/rex/ole/fat.rb +96 -0
- data/lib/rex/ole/header.rb +201 -0
- data/lib/rex/ole/minifat.rb +74 -0
- data/lib/rex/ole/propset.rb +141 -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 +392 -0
- data/lib/rex/ole/stream.rb +50 -0
- data/lib/rex/ole/substorage.rb +46 -0
- data/lib/rex/ole/util.rb +154 -0
- data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
- data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
- data/lib/rex/parser/appscan_nokogiri.rb +367 -0
- data/lib/rex/parser/arguments.rb +108 -0
- data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
- data/lib/rex/parser/ci_nokogiri.rb +193 -0
- data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
- data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
- data/lib/rex/parser/group_policy_preferences.rb +185 -0
- data/lib/rex/parser/ini.rb +186 -0
- data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
- data/lib/rex/parser/ip360_xml.rb +98 -0
- data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
- data/lib/rex/parser/nessus_xml.rb +121 -0
- data/lib/rex/parser/netsparker_xml.rb +109 -0
- data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
- data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
- data/lib/rex/parser/nexpose_xml.rb +172 -0
- data/lib/rex/parser/nmap_nokogiri.rb +394 -0
- data/lib/rex/parser/nmap_xml.rb +166 -0
- data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
- data/lib/rex/parser/openvas_nokogiri.rb +172 -0
- data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
- data/lib/rex/parser/retina_xml.rb +110 -0
- data/lib/rex/parser/unattend.rb +171 -0
- data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
- data/lib/rex/payloads.rb +2 -0
- data/lib/rex/payloads/win32.rb +3 -0
- data/lib/rex/payloads/win32/common.rb +27 -0
- data/lib/rex/payloads/win32/kernel.rb +54 -0
- data/lib/rex/payloads/win32/kernel/common.rb +55 -0
- data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
- data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
- data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
- data/lib/rex/peparsey.rb +10 -0
- data/lib/rex/peparsey/exceptions.rb +30 -0
- data/lib/rex/peparsey/pe.rb +210 -0
- data/lib/rex/peparsey/pe_memdump.rb +61 -0
- data/lib/rex/peparsey/pebase.rb +1662 -0
- data/lib/rex/peparsey/section.rb +128 -0
- data/lib/rex/pescan.rb +11 -0
- data/lib/rex/pescan/analyze.rb +366 -0
- data/lib/rex/pescan/scanner.rb +230 -0
- data/lib/rex/pescan/search.rb +68 -0
- data/lib/rex/platforms.rb +2 -0
- data/lib/rex/platforms/windows.rb +52 -0
- data/lib/rex/poly.rb +134 -0
- data/lib/rex/poly/block.rb +480 -0
- data/lib/rex/poly/machine.rb +13 -0
- data/lib/rex/poly/machine/machine.rb +830 -0
- data/lib/rex/poly/machine/x86.rb +509 -0
- data/lib/rex/poly/register.rb +101 -0
- data/lib/rex/poly/register/x86.rb +41 -0
- data/lib/rex/post.rb +7 -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 +5 -0
- data/lib/rex/post/meterpreter/channel.rb +446 -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 +483 -0
- data/lib/rex/post/meterpreter/client_core.rb +352 -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/android/android.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
- data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
- data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
- 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 +94 -0
- data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
- 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 +43 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
- data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
- 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 +57 -0
- data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -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 +109 -0
- data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
- data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
- 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 +67 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
- 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 +87 -0
- 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 +613 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -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 +60 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -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 +328 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -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 +709 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -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 +142 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
- 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 +242 -0
- 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 +232 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -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 +15 -0
- data/lib/rex/proto/addp.rb +218 -0
- data/lib/rex/proto/dcerpc.rb +7 -0
- data/lib/rex/proto/dcerpc/client.rb +362 -0
- data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
- data/lib/rex/proto/dcerpc/handle.rb +48 -0
- data/lib/rex/proto/dcerpc/ndr.rb +73 -0
- data/lib/rex/proto/dcerpc/packet.rb +264 -0
- data/lib/rex/proto/dcerpc/response.rb +188 -0
- data/lib/rex/proto/dcerpc/uuid.rb +85 -0
- 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 +7 -0
- data/lib/rex/proto/dhcp/constants.rb +34 -0
- data/lib/rex/proto/dhcp/server.rb +334 -0
- data/lib/rex/proto/drda.rb +6 -0
- data/lib/rex/proto/drda/constants.rb +50 -0
- data/lib/rex/proto/drda/packet.rb +253 -0
- data/lib/rex/proto/drda/utils.rb +124 -0
- data/lib/rex/proto/http.rb +7 -0
- data/lib/rex/proto/http/client.rb +722 -0
- data/lib/rex/proto/http/client_request.rb +472 -0
- data/lib/rex/proto/http/handler.rb +47 -0
- data/lib/rex/proto/http/handler/erb.rb +129 -0
- data/lib/rex/proto/http/handler/proc.rb +61 -0
- data/lib/rex/proto/http/header.rb +173 -0
- data/lib/rex/proto/http/packet.rb +414 -0
- data/lib/rex/proto/http/request.rb +354 -0
- data/lib/rex/proto/http/response.rb +151 -0
- data/lib/rex/proto/http/server.rb +385 -0
- data/lib/rex/proto/iax2.rb +2 -0
- data/lib/rex/proto/iax2/call.rb +326 -0
- data/lib/rex/proto/iax2/client.rb +218 -0
- data/lib/rex/proto/iax2/codecs.rb +5 -0
- data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
- data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
- data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
- data/lib/rex/proto/iax2/constants.rb +262 -0
- data/lib/rex/proto/ipmi.rb +57 -0
- data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
- data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
- data/lib/rex/proto/ipmi/rakp2.rb +36 -0
- data/lib/rex/proto/ipmi/utils.rb +125 -0
- data/lib/rex/proto/natpmp.rb +7 -0
- data/lib/rex/proto/natpmp/constants.rb +19 -0
- data/lib/rex/proto/natpmp/packet.rb +45 -0
- data/lib/rex/proto/ntlm.rb +8 -0
- data/lib/rex/proto/ntlm/base.rb +327 -0
- data/lib/rex/proto/ntlm/constants.rb +75 -0
- data/lib/rex/proto/ntlm/crypt.rb +412 -0
- data/lib/rex/proto/ntlm/exceptions.rb +17 -0
- data/lib/rex/proto/ntlm/message.rb +534 -0
- data/lib/rex/proto/ntlm/utils.rb +765 -0
- data/lib/rex/proto/ntp.rb +3 -0
- data/lib/rex/proto/ntp/constants.rb +12 -0
- data/lib/rex/proto/ntp/modes.rb +130 -0
- data/lib/rex/proto/pjl.rb +31 -0
- data/lib/rex/proto/pjl/client.rb +163 -0
- data/lib/rex/proto/proxy/socks4a.rb +441 -0
- data/lib/rex/proto/rfb.rb +13 -0
- data/lib/rex/proto/rfb/cipher.rb +82 -0
- data/lib/rex/proto/rfb/client.rb +205 -0
- data/lib/rex/proto/rfb/constants.rb +50 -0
- data/lib/rex/proto/sip.rb +4 -0
- data/lib/rex/proto/sip/response.rb +61 -0
- data/lib/rex/proto/smb.rb +8 -0
- data/lib/rex/proto/smb/client.rb +2064 -0
- data/lib/rex/proto/smb/constants.rb +1064 -0
- data/lib/rex/proto/smb/crypt.rb +37 -0
- data/lib/rex/proto/smb/evasions.rb +67 -0
- data/lib/rex/proto/smb/exceptions.rb +867 -0
- data/lib/rex/proto/smb/simpleclient.rb +173 -0
- 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 +104 -0
- data/lib/rex/proto/sunrpc.rb +2 -0
- data/lib/rex/proto/sunrpc/client.rb +196 -0
- data/lib/rex/proto/tftp.rb +13 -0
- data/lib/rex/proto/tftp/client.rb +344 -0
- data/lib/rex/proto/tftp/constants.rb +39 -0
- data/lib/rex/proto/tftp/server.rb +497 -0
- data/lib/rex/random_identifier_generator.rb +177 -0
- data/lib/rex/registry.rb +14 -0
- data/lib/rex/registry/hive.rb +132 -0
- data/lib/rex/registry/lfkey.rb +51 -0
- data/lib/rex/registry/nodekey.rb +54 -0
- data/lib/rex/registry/regf.rb +25 -0
- data/lib/rex/registry/valuekey.rb +67 -0
- data/lib/rex/registry/valuelist.rb +29 -0
- data/lib/rex/ropbuilder.rb +8 -0
- data/lib/rex/ropbuilder/rop.rb +271 -0
- data/lib/rex/script.rb +42 -0
- data/lib/rex/script/base.rb +61 -0
- data/lib/rex/script/meterpreter.rb +16 -0
- data/lib/rex/script/shell.rb +10 -0
- data/lib/rex/service.rb +49 -0
- data/lib/rex/service_manager.rb +154 -0
- data/lib/rex/services/local_relay.rb +424 -0
- data/lib/rex/socket.rb +788 -0
- data/lib/rex/socket/comm.rb +120 -0
- data/lib/rex/socket/comm/local.rb +526 -0
- data/lib/rex/socket/ip.rb +132 -0
- data/lib/rex/socket/parameters.rb +363 -0
- data/lib/rex/socket/range_walker.rb +470 -0
- data/lib/rex/socket/ssl_tcp.rb +345 -0
- data/lib/rex/socket/ssl_tcp_server.rb +188 -0
- data/lib/rex/socket/subnet_walker.rb +76 -0
- data/lib/rex/socket/switch_board.rb +289 -0
- data/lib/rex/socket/tcp.rb +79 -0
- data/lib/rex/socket/tcp_server.rb +67 -0
- data/lib/rex/socket/udp.rb +165 -0
- data/lib/rex/sslscan/result.rb +201 -0
- data/lib/rex/sslscan/scanner.rb +206 -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 +85 -0
- data/lib/rex/sync/read_write_lock.rb +177 -0
- data/lib/rex/sync/ref.rb +58 -0
- data/lib/rex/sync/thread_safe.rb +83 -0
- data/lib/rex/text.rb +1813 -0
- data/lib/rex/thread_factory.rb +43 -0
- data/lib/rex/time.rb +66 -0
- data/lib/rex/transformer.rb +116 -0
- data/lib/rex/ui.rb +22 -0
- data/lib/rex/ui/interactive.rb +304 -0
- data/lib/rex/ui/output.rb +85 -0
- data/lib/rex/ui/output/none.rb +19 -0
- data/lib/rex/ui/progress_tracker.rb +97 -0
- data/lib/rex/ui/subscriber.rb +160 -0
- data/lib/rex/ui/text/color.rb +98 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
- data/lib/rex/ui/text/input.rb +119 -0
- data/lib/rex/ui/text/input/buffer.rb +79 -0
- data/lib/rex/ui/text/input/readline.rb +129 -0
- data/lib/rex/ui/text/input/socket.rb +96 -0
- data/lib/rex/ui/text/input/stdio.rb +46 -0
- data/lib/rex/ui/text/irb_shell.rb +62 -0
- data/lib/rex/ui/text/output.rb +86 -0
- data/lib/rex/ui/text/output/buffer.rb +62 -0
- data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
- data/lib/rex/ui/text/output/file.rb +44 -0
- data/lib/rex/ui/text/output/socket.rb +44 -0
- data/lib/rex/ui/text/output/stdio.rb +53 -0
- data/lib/rex/ui/text/output/tee.rb +56 -0
- data/lib/rex/ui/text/progress_tracker.rb +57 -0
- data/lib/rex/ui/text/shell.rb +403 -0
- data/lib/rex/ui/text/table.rb +346 -0
- data/lib/rex/zip.rb +96 -0
- data/lib/rex/zip/archive.rb +130 -0
- data/lib/rex/zip/blocks.rb +184 -0
- data/lib/rex/zip/entry.rb +122 -0
- data/lib/rex/zip/jar.rb +283 -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 +536 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
YWZjMDZlNDJjMzQ5YTMyODZkMTAzMWUzNzE1YWQ3ZjA2OTkxMDc3ZQ==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
OWFhNGFiZDQ1MDBjYmJkZTU2NDljMzM5YjJkM2U1M2ZkZTk5NTljYQ==
|
|
7
|
+
SHA512:
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
MmE3ZjFmYTk3YjE2YmI3NzFlNThhNmI3YzJiMTVhYWFlMTY0ZDVhMzdjZGMw
|
|
10
|
+
NzJkOTA4OGNjMWU4M2ZmYzUwMTI2ZDBhYTcyNmVjNzI4ZWQ3NzBlMDVlZjk3
|
|
11
|
+
ZmY5N2YyZWQwZTJhYjM2ZGFlOTMyYmNiMmRhMDliM2NlOGNkZGQ=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
YmE4MGI3MTA2NDE3NGIyNGE3NzRmOWZlMWRhNzU4NzYyN2ZiMTliN2RmMzBi
|
|
14
|
+
Y2ZiMjk1MjQ1M2RkMmIyNDk4NWUxZmIwOTZiOTFmMGE4YThlZmFmODcwMGFm
|
|
15
|
+
ODMwNjNjYmNlNGM0YTUzY2Y1MTk5MGIzZTA4OWFjMTQ1Y2VjODg=
|
data/README.markdown
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Rex
|
|
2
|
+
|
|
3
|
+
An re-packaging of the Rex library included in the Metasploit Framework for use by non-Metasploit applications. Originally created by Jacob Hammack and made official by the Rapid7 development team. The upstream of this package is the rex subdirectory of https://github.com/rapid7/metasploit-framework
|
|
4
|
+
|
|
5
|
+
Note that prior to version 2.0.0, the 'rex' gem was an unrelated library developed by Aaron Paterson (@tenderlove).
|
|
6
|
+
|
|
7
|
+
For users of the prior library (a lexical scanner generator), set your Gemfile to something like the following:
|
|
8
|
+
```
|
|
9
|
+
gem 'rex', '< 2.0.0'
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
This package replaces the librex gem.
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
$ gem install rex
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
# Credits
|
|
19
|
+
|
|
20
|
+
* [The Metasploit Community](https://github.com/rapid7/metasploit-framework)
|
|
21
|
+
* [Jacob Hammack](https://github.com/hammackj) for initially extracting rex from Metasploit
|
|
22
|
+
* [Aaron Paterson](https://github.com/tenderlove) for letting us repurpose the 'rex' gem name
|
|
23
|
+
* [Rapid7](http://www.rapid7.com/) for continued support
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
#Jacob Hammack
|
|
4
|
+
#Jacob.Hammack@hammackj.com
|
|
5
|
+
#An Example for connecting to a Windows Share.
|
|
6
|
+
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rex'
|
|
9
|
+
|
|
10
|
+
host = ARGV[0]
|
|
11
|
+
username = ARGV[1]
|
|
12
|
+
password = ARGV[2]
|
|
13
|
+
#hostname is interesting, new windows require the actual hostname of the box
|
|
14
|
+
#to connect so this may not work on 7
|
|
15
|
+
hostname = "*SMBSERVER"
|
|
16
|
+
domain = ""
|
|
17
|
+
|
|
18
|
+
begin
|
|
19
|
+
sock = Rex::Socket::Tcp.create('PeerHost' => host, 'PeerPort' => 139)
|
|
20
|
+
smb = Rex::Proto::SMB::SimpleClient.new(sock)
|
|
21
|
+
|
|
22
|
+
puts "[*] Logging in to #{host}"
|
|
23
|
+
smb.login(hostname, username, password, domain)
|
|
24
|
+
smb.connect("Admin$")
|
|
25
|
+
|
|
26
|
+
if smb.client.auth_user
|
|
27
|
+
puts "[*] Connected to Admin$"
|
|
28
|
+
else
|
|
29
|
+
puts "[!] Unable to Connect to Admin$"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
sock.close
|
|
33
|
+
rescue Exception => e
|
|
34
|
+
puts "#{e.message}\n#{e.backtrace}\n\n"
|
|
35
|
+
end
|
data/lib/rex.rb
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
The Metasploit Rex library is provided under the 3-clause BSD license.
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2005-2010, Rapid7, Inc.
|
|
6
|
+
All rights reserved.
|
|
7
|
+
|
|
8
|
+
Redistribution and use in source and binary forms, with or without modification,
|
|
9
|
+
are permitted provided that the following conditions are met:
|
|
10
|
+
|
|
11
|
+
* Redistributions of source code must retain the above copyright notice, this
|
|
12
|
+
list of conditions and the following disclaimer.
|
|
13
|
+
|
|
14
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
15
|
+
this list of conditions and the following disclaimer in the documentation
|
|
16
|
+
and/or other materials provided with the distribution.
|
|
17
|
+
|
|
18
|
+
* Neither the name of Rapid7, Inc. nor the names of its contributors may be
|
|
19
|
+
used to endorse or promote products derived from this software without
|
|
20
|
+
specific prior written permission.
|
|
21
|
+
|
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
23
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
24
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
25
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
|
26
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
27
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
28
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
29
|
+
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
30
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
31
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
|
|
33
|
+
=end
|
|
34
|
+
|
|
35
|
+
module Rex
|
|
36
|
+
Root = File.join(File.expand_path(File.dirname(__FILE__)), 'rex')
|
|
37
|
+
LogSource = "rex"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Generic classes
|
|
41
|
+
require 'rex/constants'
|
|
42
|
+
require 'rex/exceptions'
|
|
43
|
+
require 'rex/transformer'
|
|
44
|
+
require 'rex/text'
|
|
45
|
+
require 'rex/time'
|
|
46
|
+
require 'rex/job_container'
|
|
47
|
+
require 'rex/file'
|
|
48
|
+
|
|
49
|
+
# Thread safety and synchronization
|
|
50
|
+
require 'rex/sync'
|
|
51
|
+
|
|
52
|
+
# Thread factory
|
|
53
|
+
require 'rex/thread_factory'
|
|
54
|
+
|
|
55
|
+
# Encoding
|
|
56
|
+
require 'rex/encoder/xor'
|
|
57
|
+
require 'rex/encoding/xor'
|
|
58
|
+
|
|
59
|
+
# Architecture subsystem
|
|
60
|
+
require 'rex/arch'
|
|
61
|
+
|
|
62
|
+
# Assembly
|
|
63
|
+
require 'rex/assembly/nasm'
|
|
64
|
+
|
|
65
|
+
# Logging
|
|
66
|
+
require 'rex/logging/log_dispatcher'
|
|
67
|
+
|
|
68
|
+
# IO
|
|
69
|
+
require 'rex/io/stream'
|
|
70
|
+
require 'rex/io/stream_abstraction'
|
|
71
|
+
require 'rex/io/stream_server'
|
|
72
|
+
|
|
73
|
+
# Sockets
|
|
74
|
+
require 'rex/socket'
|
|
75
|
+
|
|
76
|
+
# Protocols
|
|
77
|
+
require 'rex/proto'
|
|
78
|
+
require 'rex/mac_oui'
|
|
79
|
+
|
|
80
|
+
# Parsers
|
|
81
|
+
require 'rex/parser/arguments'
|
|
82
|
+
require 'rex/parser/ini'
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# Compatibility
|
|
86
|
+
require 'rex/compat'
|
|
87
|
+
|
|
88
|
+
# Platforms
|
|
89
|
+
require 'rex/platforms'
|
|
90
|
+
|
|
91
|
+
# SSLScan
|
|
92
|
+
require 'rex/sslscan/scanner'
|
|
93
|
+
require 'rex/sslscan/result'
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# Overload the Kernel.sleep() function to be thread-safe
|
|
97
|
+
Kernel.class_eval("
|
|
98
|
+
def sleep(seconds=nil)
|
|
99
|
+
Rex::ThreadSafe.sleep(seconds)
|
|
100
|
+
end
|
|
101
|
+
")
|
|
102
|
+
|
|
103
|
+
# Overload the Kernel.select function to be thread-safe
|
|
104
|
+
Kernel.class_eval("
|
|
105
|
+
def select(rfd = nil, wfd = nil, efd = nil, to = nil)
|
|
106
|
+
Rex::ThreadSafe.select(rfd, wfd, efd, to)
|
|
107
|
+
end
|
|
108
|
+
")
|
data/lib/rex/LICENSE
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
The Metasploit Rex library is provided under the 3-clause BSD license.
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2005-2006, Rapid7, Inc.
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without modification,
|
|
7
|
+
are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
* Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
* Neither the name of Rapid7, Inc. nor the names of its contributors may be
|
|
17
|
+
used to endorse or promote products derived from this software without
|
|
18
|
+
specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
21
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
22
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
|
24
|
+
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
25
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
26
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
27
|
+
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
29
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/lib/rex/arch.rb
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
require 'rex/constants'
|
|
3
|
+
|
|
4
|
+
module Rex
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
###
|
|
8
|
+
#
|
|
9
|
+
# This module provides generalized methods for performing operations that are
|
|
10
|
+
# architecture specific. Furthermore, the modules contained within this
|
|
11
|
+
# module provide features that are specific to a given architecture.
|
|
12
|
+
#
|
|
13
|
+
###
|
|
14
|
+
module Arch
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# Architecture classes
|
|
18
|
+
#
|
|
19
|
+
require 'rex/arch/x86'
|
|
20
|
+
require 'rex/arch/sparc'
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# This routine adjusts the stack pointer for a given architecture.
|
|
24
|
+
#
|
|
25
|
+
def self.adjust_stack_pointer(arch, adjustment)
|
|
26
|
+
|
|
27
|
+
if ( arch.is_a?(::Array))
|
|
28
|
+
arch = arch[0]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
case arch
|
|
32
|
+
when /x86/
|
|
33
|
+
Rex::Arch::X86.adjust_reg(Rex::Arch::X86::ESP, adjustment)
|
|
34
|
+
else
|
|
35
|
+
nil
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
# This route provides address packing for the specified arch
|
|
41
|
+
#
|
|
42
|
+
def self.pack_addr(arch, addr)
|
|
43
|
+
|
|
44
|
+
if ( arch.is_a?(::Array))
|
|
45
|
+
arch = arch[0]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
case arch
|
|
49
|
+
when ARCH_X86
|
|
50
|
+
[addr].pack('V')
|
|
51
|
+
when ARCH_X86_64
|
|
52
|
+
[addr].pack('Q<')
|
|
53
|
+
when ARCH_MIPS # ambiguous
|
|
54
|
+
[addr].pack('N')
|
|
55
|
+
when ARCH_MIPSBE
|
|
56
|
+
[addr].pack('N')
|
|
57
|
+
when ARCH_MIPSLE
|
|
58
|
+
[addr].pack('V')
|
|
59
|
+
when ARCH_PPC # ambiguous
|
|
60
|
+
[addr].pack('N')
|
|
61
|
+
when ARCH_SPARC
|
|
62
|
+
[addr].pack('N')
|
|
63
|
+
when ARCH_ARMLE
|
|
64
|
+
[addr].pack('V')
|
|
65
|
+
when ARCH_ARMBE
|
|
66
|
+
[addr].pack('N')
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# This routine reports the endianess of a given architecture
|
|
72
|
+
#
|
|
73
|
+
def self.endian(arch)
|
|
74
|
+
|
|
75
|
+
if ( arch.is_a?(::Array))
|
|
76
|
+
arch = arch[0]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
case arch
|
|
80
|
+
when ARCH_X86
|
|
81
|
+
return ENDIAN_LITTLE
|
|
82
|
+
when ARCH_X86_64
|
|
83
|
+
return ENDIAN_LITTLE
|
|
84
|
+
when ARCH_MIPS # ambiguous
|
|
85
|
+
return ENDIAN_BIG
|
|
86
|
+
when ARCH_MIPSLE
|
|
87
|
+
return ENDIAN_LITTLE
|
|
88
|
+
when ARCH_MIPSBE
|
|
89
|
+
return ENDIAN_BIG
|
|
90
|
+
when ARCH_PPC # ambiguous
|
|
91
|
+
return ENDIAN_BIG
|
|
92
|
+
when ARCH_SPARC
|
|
93
|
+
return ENDIAN_BIG
|
|
94
|
+
when ARCH_ARMLE
|
|
95
|
+
return ENDIAN_LITTLE
|
|
96
|
+
when ARCH_ARMBE
|
|
97
|
+
return ENDIAN_BIG
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
return ENDIAN_LITTLE
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# Everything here is mostly stolen from vlad's perl sparc stuff
|
|
8
|
+
#
|
|
9
|
+
module Sparc
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Register number constants
|
|
13
|
+
#
|
|
14
|
+
RegisterNumber =
|
|
15
|
+
{
|
|
16
|
+
'g0' => 0, 'g1' => 1, 'g2' => 2, 'g3' => 3,
|
|
17
|
+
'g4' => 4, 'g5' => 5, 'g6' => 6, 'g7' => 7,
|
|
18
|
+
'o0' => 8, 'o1' => 9, 'o2' => 10, 'o3' => 11,
|
|
19
|
+
'o4' => 12, 'o5' => 13, 'o6' => 14, 'o7' => 15,
|
|
20
|
+
'l0' => 16, 'l1' => 17, 'l2' => 18, 'l3' => 19,
|
|
21
|
+
'l4' => 20, 'l5' => 21, 'l6' => 22, 'l7' => 23,
|
|
22
|
+
'i0' => 24, 'i1' => 25, 'i2' => 26, 'i3' => 27,
|
|
23
|
+
'i4' => 28, 'i5' => 29, 'i6' => 30, 'i7' => 31,
|
|
24
|
+
'sp' => 14, 'fp' => 30,
|
|
25
|
+
} # :nodoc:
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Encodes a SETHI instruction with the value 'constant' being put into 'dst' register
|
|
29
|
+
#
|
|
30
|
+
def self.sethi(constant, dst)
|
|
31
|
+
[
|
|
32
|
+
(RegisterNumber[dst] << 25) |
|
|
33
|
+
(4 << 22) |
|
|
34
|
+
(constant >> 10)
|
|
35
|
+
].pack('N')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Encodes an OR instruction with the value 'constant' being OR'ed with the 'src' register into the 'dst' register
|
|
40
|
+
#
|
|
41
|
+
def self.ori(src, constant, dst)
|
|
42
|
+
[
|
|
43
|
+
(2 << 30) |
|
|
44
|
+
(RegisterNumber[dst] << 25) |
|
|
45
|
+
(2 << 19) |
|
|
46
|
+
(RegisterNumber[src] << 14) |
|
|
47
|
+
(1 << 13) |
|
|
48
|
+
(constant & 0x1fff)
|
|
49
|
+
].pack('N')
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# Puts 'constant' into the 'dst' register using as few instructions as possible by checking the size of the value.
|
|
54
|
+
# XXX: signedness support
|
|
55
|
+
#
|
|
56
|
+
def self.set(constant, dst)
|
|
57
|
+
if (constant <= 4095 and constant >= 0)
|
|
58
|
+
ori('g0', constant, dst)
|
|
59
|
+
elsif (constant & 0x3ff != 0)
|
|
60
|
+
set_dword(constant, dst)
|
|
61
|
+
else
|
|
62
|
+
sethi(constant, dst)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# Puts 'constant' into the 'dst' register using both sethi and ori (necessary to use both uncessarily in some cases with encoders)
|
|
68
|
+
#
|
|
69
|
+
def self.set_dword(constant, dst)
|
|
70
|
+
sethi(constant, dst) + ori(dst, constant & 0x3ff, dst)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end end
|
data/lib/rex/arch/x86.rb
ADDED
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
# -*- coding: binary -*-
|
|
2
|
+
|
|
3
|
+
module Rex
|
|
4
|
+
module Arch
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# everything here is mostly stole from vlad's perl x86 stuff
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
module X86
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# Register number constants
|
|
14
|
+
#
|
|
15
|
+
EAX = AL = AX = ES = 0
|
|
16
|
+
ECX = CL = CX = CS = 1
|
|
17
|
+
EDX = DL = DX = SS = 2
|
|
18
|
+
EBX = BL = BX = DS = 3
|
|
19
|
+
ESP = AH = SP = FS = 4
|
|
20
|
+
EBP = CH = BP = GS = 5
|
|
21
|
+
ESI = DH = SI = 6
|
|
22
|
+
EDI = BH = DI = 7
|
|
23
|
+
|
|
24
|
+
REG_NAMES32 = [ 'eax', 'ecx', 'edx', 'ebx', 'esp', 'ebp', 'esi', 'edi' ]
|
|
25
|
+
|
|
26
|
+
REG_NAMES16 = [ 'ax', 'cx', 'dx', 'bx', 'sp', 'bp', 'si', 'di' ]
|
|
27
|
+
|
|
28
|
+
REG_NAMES8L = [ 'al', 'cl', 'dl', 'bl', nil, nil, nil, nil ]
|
|
29
|
+
|
|
30
|
+
# Jump tp a specific register
|
|
31
|
+
def self.jmp_reg(str)
|
|
32
|
+
reg = reg_number(str)
|
|
33
|
+
_check_reg(reg)
|
|
34
|
+
"\xFF" + [224 + reg].pack('C')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# Generate a LOOP instruction (Decrement ECX and jump short if ECX == 0)
|
|
39
|
+
#
|
|
40
|
+
def self.loop(offset)
|
|
41
|
+
"\xE2" + pack_lsb(rel_number(offset, -2))
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# This method returns the opcodes that compose a jump instruction to the
|
|
46
|
+
# supplied relative offset.
|
|
47
|
+
def self.jmp(addr)
|
|
48
|
+
"\xe9" + pack_dword(rel_number(addr))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#
|
|
52
|
+
# This method adds/subs a packed long integer
|
|
53
|
+
#
|
|
54
|
+
def self.dword_adjust(dword, amount=0)
|
|
55
|
+
pack_dword(dword.unpack('V')[0] + amount)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
#
|
|
59
|
+
# This method returns the opcodes that compose a tag-based search routine
|
|
60
|
+
#
|
|
61
|
+
def self.searcher(tag)
|
|
62
|
+
"\xbe" + dword_adjust(tag,-1)+ # mov esi, Tag - 1
|
|
63
|
+
"\x46" + # inc esi
|
|
64
|
+
"\x47" + # inc edi (end_search:)
|
|
65
|
+
"\x39\x37" + # cmp [edi],esi
|
|
66
|
+
"\x75\xfb" + # jnz 0xa (end_search)
|
|
67
|
+
"\x46" + # inc esi
|
|
68
|
+
"\x4f" + # dec edi (start_search:)
|
|
69
|
+
"\x39\x77\xfc" + # cmp [edi-0x4],esi
|
|
70
|
+
"\x75\xfa" + # jnz 0x10 (start_search)
|
|
71
|
+
jmp_reg('edi') # jmp edi
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#
|
|
75
|
+
# Generates a buffer that will copy memory immediately following the stub
|
|
76
|
+
# that is generated to be copied to the stack
|
|
77
|
+
#
|
|
78
|
+
def self.copy_to_stack(len)
|
|
79
|
+
# four byte align
|
|
80
|
+
len = (len + 3) & ~0x3
|
|
81
|
+
|
|
82
|
+
stub =
|
|
83
|
+
"\xeb\x0f"+ # jmp _end
|
|
84
|
+
push_dword(len)+ # push n
|
|
85
|
+
"\x59"+ # pop ecx
|
|
86
|
+
"\x5e"+ # pop esi
|
|
87
|
+
"\x29\xcc"+ # sub esp, ecx
|
|
88
|
+
"\x89\xe7"+ # mov edi, esp
|
|
89
|
+
"\xf3\xa4"+ # rep movsb
|
|
90
|
+
"\xff\xe4"+ # jmp esp
|
|
91
|
+
"\xe8\xec\xff\xff\xff" # call _start
|
|
92
|
+
|
|
93
|
+
stub
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
#
|
|
97
|
+
# This method returns the opcodes that compose a short jump instruction to
|
|
98
|
+
# the supplied relative offset.
|
|
99
|
+
#
|
|
100
|
+
def self.jmp_short(addr)
|
|
101
|
+
"\xeb" + pack_lsb(rel_number(addr, -2))
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
#
|
|
105
|
+
# This method returns the opcodes that compose a relative call instruction
|
|
106
|
+
# to the address specified.
|
|
107
|
+
#
|
|
108
|
+
def self.call(addr)
|
|
109
|
+
"\xe8" + pack_dword(rel_number(addr, -5))
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
#
|
|
113
|
+
# This method returns a number offset to the supplied string.
|
|
114
|
+
#
|
|
115
|
+
def self.rel_number(num, delta = 0)
|
|
116
|
+
s = num.to_s
|
|
117
|
+
|
|
118
|
+
case s[0, 2]
|
|
119
|
+
when '$+'
|
|
120
|
+
num = s[2 .. -1].to_i
|
|
121
|
+
when '$-'
|
|
122
|
+
num = -1 * s[2 .. -1].to_i
|
|
123
|
+
when '0x'
|
|
124
|
+
num = s.hex
|
|
125
|
+
else
|
|
126
|
+
delta = 0
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
return num + delta
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
#
|
|
133
|
+
# This method returns the number associated with a named register.
|
|
134
|
+
#
|
|
135
|
+
def self.reg_number(str)
|
|
136
|
+
return self.const_get(str.upcase)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
#
|
|
140
|
+
# This method returns the register named associated with a given register
|
|
141
|
+
# number.
|
|
142
|
+
#
|
|
143
|
+
def self.reg_name32(num)
|
|
144
|
+
_check_reg(num)
|
|
145
|
+
return REG_NAMES32[num].dup
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
#
|
|
149
|
+
# This method generates the encoded effective value for a register.
|
|
150
|
+
#
|
|
151
|
+
def self.encode_effective(shift, dst)
|
|
152
|
+
return (0xc0 | (shift << 3) | dst)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
#
|
|
156
|
+
# This method generates the mod r/m character for a source and destination
|
|
157
|
+
# register.
|
|
158
|
+
#
|
|
159
|
+
def self.encode_modrm(dst, src)
|
|
160
|
+
_check_reg(dst, src)
|
|
161
|
+
return (0xc0 | src | dst << 3).chr
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
#
|
|
165
|
+
# This method generates a push byte instruction.
|
|
166
|
+
#
|
|
167
|
+
def self.push_byte(byte)
|
|
168
|
+
# push byte will sign extend...
|
|
169
|
+
if byte < 128 && byte >= -128
|
|
170
|
+
return "\x6a" + (byte & 0xff).chr
|
|
171
|
+
end
|
|
172
|
+
raise ::ArgumentError, "Can only take signed byte values!", caller()
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
#
|
|
176
|
+
# This method generates a push word instruction.
|
|
177
|
+
#
|
|
178
|
+
def self.push_word(val)
|
|
179
|
+
return "\x66\x68" + pack_word(val)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
#
|
|
183
|
+
# This method generates a push dword instruction.
|
|
184
|
+
#
|
|
185
|
+
def self.push_dword(val)
|
|
186
|
+
return "\x68" + pack_dword(val)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
#
|
|
190
|
+
# This method generates a pop dword instruction into a register.
|
|
191
|
+
#
|
|
192
|
+
def self.pop_dword(dst)
|
|
193
|
+
_check_reg(dst)
|
|
194
|
+
return (0x58 | dst).chr
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
#
|
|
198
|
+
# This method generates an instruction that clears the supplied register in
|
|
199
|
+
# a manner that attempts to avoid bad characters, if supplied.
|
|
200
|
+
#
|
|
201
|
+
def self.clear(reg, badchars = '')
|
|
202
|
+
_check_reg(reg)
|
|
203
|
+
return set(reg, 0, badchars)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
#
|
|
207
|
+
# This method generates the opcodes that set the low byte of a given
|
|
208
|
+
# register to the supplied value.
|
|
209
|
+
#
|
|
210
|
+
def self.mov_byte(reg, val)
|
|
211
|
+
_check_reg(reg)
|
|
212
|
+
# chr will raise RangeError if val not between 0 .. 255
|
|
213
|
+
return (0xb0 | reg).chr + val.chr
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
#
|
|
217
|
+
# This method generates the opcodes that set the low word of a given
|
|
218
|
+
# register to the supplied value.
|
|
219
|
+
#
|
|
220
|
+
def self.mov_word(reg, val)
|
|
221
|
+
_check_reg(reg)
|
|
222
|
+
if val < 0 || val > 0xffff
|
|
223
|
+
raise RangeError, "Can only take unsigned word values!", caller()
|
|
224
|
+
end
|
|
225
|
+
return "\x66" + (0xb8 | reg).chr + pack_word(val)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
#
|
|
229
|
+
# This method generates the opcodes that set the a register to the
|
|
230
|
+
# supplied value.
|
|
231
|
+
#
|
|
232
|
+
def self.mov_dword(reg, val)
|
|
233
|
+
_check_reg(reg)
|
|
234
|
+
return (0xb8 | reg).chr + pack_dword(val)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
#
|
|
238
|
+
# This method is a general way of setting a register to a value. Depending
|
|
239
|
+
# on the value supplied, different sets of instructions may be used.
|
|
240
|
+
#
|
|
241
|
+
# TODO: Make this moderatly intelligent so it chain instructions by itself
|
|
242
|
+
# (ie. xor eax, eax + mov al, 4 + xchg ah, al)
|
|
243
|
+
def self.set(dst, val, badchars = '')
|
|
244
|
+
_check_reg(dst)
|
|
245
|
+
|
|
246
|
+
# If the value is 0 try xor/sub dst, dst (2 bytes)
|
|
247
|
+
if(val == 0)
|
|
248
|
+
opcodes = Rex::Text.remove_badchars("\x29\x2b\x31\x33", badchars)
|
|
249
|
+
if !opcodes.empty?
|
|
250
|
+
return opcodes[rand(opcodes.length)].chr + encode_modrm(dst, dst)
|
|
251
|
+
end
|
|
252
|
+
# TODO: SHL/SHR
|
|
253
|
+
# TODO: AND
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# try push BYTE val; pop dst (3 bytes)
|
|
257
|
+
begin
|
|
258
|
+
return _check_badchars(push_byte(val) + pop_dword(dst), badchars)
|
|
259
|
+
rescue ::ArgumentError, ::RuntimeError, ::RangeError
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# try clear dst, mov BYTE dst (4 bytes)
|
|
263
|
+
begin
|
|
264
|
+
# break if val == 0
|
|
265
|
+
return _check_badchars(clear(dst, badchars) + mov_byte(dst, val), badchars)
|
|
266
|
+
rescue ::ArgumentError, ::RuntimeError, ::RangeError
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# try mov DWORD dst (5 bytes)
|
|
270
|
+
begin
|
|
271
|
+
return _check_badchars(mov_dword(dst, val), badchars)
|
|
272
|
+
rescue ::ArgumentError, ::RuntimeError, ::RangeError
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
# try push DWORD, pop dst (6 bytes)
|
|
276
|
+
begin
|
|
277
|
+
return _check_badchars(push_dword(val) + pop_dword(dst), badchars)
|
|
278
|
+
rescue ::ArgumentError, ::RuntimeError, ::RangeError
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# try clear dst, mov WORD dst (6 bytes)
|
|
282
|
+
begin
|
|
283
|
+
# break if val == 0
|
|
284
|
+
return _check_badchars(clear(dst, badchars) + mov_word(dst, val), badchars)
|
|
285
|
+
rescue ::ArgumentError, ::RuntimeError, ::RangeError
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
raise RuntimeError, "No valid set instruction could be created!", caller()
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
#
|
|
292
|
+
# Builds a subtraction instruction using the supplied operand
|
|
293
|
+
# and register.
|
|
294
|
+
#
|
|
295
|
+
def self.sub(val, reg, badchars = '', add = false, adjust = false, bits = 0)
|
|
296
|
+
opcodes = []
|
|
297
|
+
shift = (add == true) ? 0 : 5
|
|
298
|
+
|
|
299
|
+
if (bits <= 8 and val >= -0x7f and val <= 0x7f)
|
|
300
|
+
opcodes <<
|
|
301
|
+
((adjust) ? '' : clear(reg, badchars)) +
|
|
302
|
+
"\x83" +
|
|
303
|
+
[ encode_effective(shift, reg) ].pack('C') +
|
|
304
|
+
[ val.to_i ].pack('C')
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
if (bits <= 16 and val >= -0xffff and val <= 0)
|
|
308
|
+
opcodes <<
|
|
309
|
+
((adjust) ? '' : clear(reg, badchars)) +
|
|
310
|
+
"\x66\x81" +
|
|
311
|
+
[ encode_effective(shift, reg) ].pack('C') +
|
|
312
|
+
[ val.to_i ].pack('v')
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
opcodes <<
|
|
316
|
+
((adjust) ? '' : clear(reg, badchars)) +
|
|
317
|
+
"\x81" +
|
|
318
|
+
[ encode_effective(shift, reg) ].pack('C') +
|
|
319
|
+
[ val.to_i ].pack('V')
|
|
320
|
+
|
|
321
|
+
# Search for a compatible opcode
|
|
322
|
+
opcodes.each { |op|
|
|
323
|
+
begin
|
|
324
|
+
_check_badchars(op, badchars)
|
|
325
|
+
rescue
|
|
326
|
+
next
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
return op
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if opcodes.empty?
|
|
333
|
+
raise RuntimeError, "Could not find a usable opcode", caller()
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
#
|
|
338
|
+
# This method generates the opcodes equivalent to subtracting with a
|
|
339
|
+
# negative value from a given register.
|
|
340
|
+
#
|
|
341
|
+
def self.add(val, reg, badchars = '', adjust = false, bits = 0)
|
|
342
|
+
sub(val, reg, badchars, true, adjust, bits)
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
#
|
|
346
|
+
# This method wrappers packing a short integer as a little-endian buffer.
|
|
347
|
+
#
|
|
348
|
+
def self.pack_word(num)
|
|
349
|
+
[num].pack('v')
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
#
|
|
353
|
+
# This method wrappers packing an integer as a little-endian buffer.
|
|
354
|
+
#
|
|
355
|
+
def self.pack_dword(num)
|
|
356
|
+
[num].pack('V')
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
#
|
|
360
|
+
# This method returns the least significant byte of a packed dword.
|
|
361
|
+
#
|
|
362
|
+
def self.pack_lsb(num)
|
|
363
|
+
pack_dword(num)[0,1]
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
#
|
|
367
|
+
# This method adjusts the value of the ESP register by a given amount.
|
|
368
|
+
#
|
|
369
|
+
def self.adjust_reg(reg, adjustment)
|
|
370
|
+
if (adjustment > 0)
|
|
371
|
+
sub(adjustment, reg, '', false, false, 32)
|
|
372
|
+
else
|
|
373
|
+
add(adjustment, reg, '', true, 32)
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
def self._check_reg(*regs) # :nodoc:
|
|
378
|
+
regs.each { |reg|
|
|
379
|
+
if reg > 7 || reg < 0
|
|
380
|
+
raise ArgumentError, "Invalid register #{reg}", caller()
|
|
381
|
+
end
|
|
382
|
+
}
|
|
383
|
+
return nil
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
def self._check_badchars(data, badchars) # :nodoc:
|
|
387
|
+
idx = Rex::Text.badchar_index(data, badchars)
|
|
388
|
+
if idx
|
|
389
|
+
raise RuntimeError, "Bad character at #{idx}", caller()
|
|
390
|
+
end
|
|
391
|
+
return data
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
#
|
|
395
|
+
# This method returns an array of 'safe' FPU instructions
|
|
396
|
+
#
|
|
397
|
+
def self.fpu_instructions
|
|
398
|
+
fpus = []
|
|
399
|
+
|
|
400
|
+
0xe8.upto(0xee) { |x| fpus << "\xd9" + x.chr }
|
|
401
|
+
0xc0.upto(0xcf) { |x| fpus << "\xd9" + x.chr }
|
|
402
|
+
0xc0.upto(0xdf) { |x| fpus << "\xda" + x.chr }
|
|
403
|
+
0xc0.upto(0xdf) { |x| fpus << "\xdb" + x.chr }
|
|
404
|
+
0xc0.upto(0xc7) { |x| fpus << "\xdd" + x.chr }
|
|
405
|
+
|
|
406
|
+
fpus << "\xd9\xd0"
|
|
407
|
+
fpus << "\xd9\xe1"
|
|
408
|
+
fpus << "\xd9\xf6"
|
|
409
|
+
fpus << "\xd9\xf7"
|
|
410
|
+
fpus << "\xd9\xe5"
|
|
411
|
+
|
|
412
|
+
# This FPU instruction seems to fail consistently on Linux
|
|
413
|
+
#fpus << "\xdb\xe1"
|
|
414
|
+
|
|
415
|
+
fpus
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
#
|
|
419
|
+
# This method returns an array containing a geteip stub, a register, and an offset
|
|
420
|
+
# This method will return nil if the getip generation fails
|
|
421
|
+
#
|
|
422
|
+
def self.geteip_fpu(badchars)
|
|
423
|
+
|
|
424
|
+
#
|
|
425
|
+
# Default badchars to an empty string
|
|
426
|
+
#
|
|
427
|
+
badchars ||= ''
|
|
428
|
+
|
|
429
|
+
#
|
|
430
|
+
# Bail out early if D9 is restricted
|
|
431
|
+
#
|
|
432
|
+
return nil if badchars.index("\xd9")
|
|
433
|
+
|
|
434
|
+
#
|
|
435
|
+
# Create a list of FPU instructions
|
|
436
|
+
#
|
|
437
|
+
fpus = *self.fpu_instructions
|
|
438
|
+
bads = []
|
|
439
|
+
badchars.each_byte do |c|
|
|
440
|
+
fpus.each do |str|
|
|
441
|
+
bads << str if (str.index(c.chr))
|
|
442
|
+
end
|
|
443
|
+
end
|
|
444
|
+
bads.each { |str| fpus.delete(str) }
|
|
445
|
+
return nil if fpus.length == 0
|
|
446
|
+
|
|
447
|
+
#
|
|
448
|
+
# Create a list of registers to use for fnstenv
|
|
449
|
+
#
|
|
450
|
+
dsts = []
|
|
451
|
+
0.upto(7) do |c|
|
|
452
|
+
dsts << c if (not badchars.index( (0x70+c).chr ))
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
if (dsts.include?(ESP) and badchars.index("\x24"))
|
|
456
|
+
dsts.delete(ESP)
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
return nil if dsts.length == 0
|
|
460
|
+
|
|
461
|
+
#
|
|
462
|
+
# Grab a random FPU instruction
|
|
463
|
+
#
|
|
464
|
+
fpu = fpus[ rand(fpus.length) ]
|
|
465
|
+
|
|
466
|
+
#
|
|
467
|
+
# Grab a random register from dst
|
|
468
|
+
#
|
|
469
|
+
while(dsts.length > 0)
|
|
470
|
+
buf = ''
|
|
471
|
+
dst = dsts[ rand(dsts.length) ]
|
|
472
|
+
dsts.delete(dst)
|
|
473
|
+
|
|
474
|
+
# If the register is not ESP, copy ESP
|
|
475
|
+
if (dst != ESP)
|
|
476
|
+
next if badchars.index( (0x70 + dst).chr )
|
|
477
|
+
|
|
478
|
+
if !(badchars.index("\x89") or badchars.index( (0xE0+dst).chr ))
|
|
479
|
+
buf << "\x89" + (0xE0 + dst).chr
|
|
480
|
+
else
|
|
481
|
+
next if badchars.index("\x54")
|
|
482
|
+
next if badchars.index( (0x58+dst).chr )
|
|
483
|
+
buf << "\x54" + (0x58 + dst).chr
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
pad = 0
|
|
488
|
+
while (pad < (128-12) and badchars.index( (256-12-pad).chr))
|
|
489
|
+
pad += 4
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
# Give up on finding a value to use here
|
|
493
|
+
if (pad == (128-12))
|
|
494
|
+
return nil
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
out = buf + fpu + "\xd9" + (0x70 + dst).chr
|
|
498
|
+
out << "\x24" if dst == ESP
|
|
499
|
+
out << (256-12-pad).chr
|
|
500
|
+
|
|
501
|
+
regs = [*(0..7)]
|
|
502
|
+
while (regs.length > 0)
|
|
503
|
+
reg = regs[ rand(regs.length) ]
|
|
504
|
+
regs.delete(reg)
|
|
505
|
+
next if reg == ESP
|
|
506
|
+
next if badchars.index( (0x58 + reg).chr )
|
|
507
|
+
|
|
508
|
+
# Pop the value back out
|
|
509
|
+
0.upto(pad / 4) { |c| out << (0x58 + reg).chr }
|
|
510
|
+
|
|
511
|
+
# Fix the value to point to self
|
|
512
|
+
gap = out.length - buf.length
|
|
513
|
+
|
|
514
|
+
return [out, REG_NAMES32[reg].upcase, gap]
|
|
515
|
+
end
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
return nil
|
|
519
|
+
end
|
|
520
|
+
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
end end
|
|
524
|
+
|