rex 1.0.2 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +22 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -3
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +321 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. data/rex.gemspec +20 -0
  492. metadata +528 -98
  493. data/CHANGELOG.rdoc +0 -7
  494. data/DOCUMENTATION.en.rdoc +0 -215
  495. data/DOCUMENTATION.ja.rdoc +0 -205
  496. data/Manifest.txt +0 -37
  497. data/README.ja +0 -73
  498. data/README.rdoc +0 -53
  499. data/Rakefile +0 -28
  500. data/bin/rex +0 -18
  501. data/lib/rex/generator.rb +0 -523
  502. data/lib/rex/info.rb +0 -16
  503. data/lib/rex/rexcmd.rb +0 -136
  504. data/sample/a.cmd +0 -1
  505. data/sample/b.cmd +0 -1
  506. data/sample/c.cmd +0 -4
  507. data/sample/calc3.racc +0 -47
  508. data/sample/calc3.rex +0 -15
  509. data/sample/calc3.rex.rb +0 -94
  510. data/sample/calc3.tab.rb +0 -188
  511. data/sample/error1.rex +0 -15
  512. data/sample/error2.rex +0 -15
  513. data/sample/sample.html +0 -32
  514. data/sample/sample.rex +0 -15
  515. data/sample/sample.rex.rb +0 -100
  516. data/sample/sample.xhtml +0 -32
  517. data/sample/sample1.c +0 -9
  518. data/sample/sample1.rex +0 -43
  519. data/sample/sample2.bas +0 -4
  520. data/sample/sample2.rex +0 -33
  521. data/sample/simple.html +0 -7
  522. data/sample/simple.xhtml +0 -10
  523. data/sample/xhtmlparser.racc +0 -66
  524. data/sample/xhtmlparser.rex +0 -72
  525. data/test/assets/test.rex +0 -12
  526. data/test/rex-20060125.rb +0 -152
  527. data/test/rex-20060511.rb +0 -143
  528. data/test/test_generator.rb +0 -184
@@ -0,0 +1,13 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+
5
+ module Poly
6
+
7
+ require 'metasm'
8
+ require 'rex/poly/machine/machine'
9
+ require 'rex/poly/machine/x86'
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,830 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+
5
+ module Poly
6
+
7
+ #
8
+ # A machine capable of creating a small blob of code in a metamorphic kind of way.
9
+ # Note: this is designed to perform an exhaustive search for a solution and can be
10
+ # slow. If you need a speedier option, the origional Rex::Polly::Block stuff is a
11
+ # better choice.
12
+ #
13
+ class Machine
14
+
15
+ QWORD = 8
16
+ DWORD = 4
17
+ WORD = 2
18
+ BYTE = 1
19
+
20
+ #
21
+ # A Permutation!
22
+ #
23
+ class Permutation
24
+
25
+ attr_accessor :active, :offset
26
+
27
+ attr_reader :name, :primitive, :length, :args
28
+
29
+ #
30
+ # Create a new permutation object.
31
+ #
32
+ def initialize( name, primitive, machine, source, args=nil )
33
+ @name = name
34
+ @primitive = primitive
35
+ @machine = machine
36
+ @source = source
37
+ @args = args
38
+ @active = false
39
+ @valid = true
40
+ @length = 0
41
+ @offset = 0
42
+ @children = ::Array.new
43
+ end
44
+
45
+ #
46
+ # Add in a child permutation to this one. Used to build the permutation tree.
47
+ #
48
+ def add_child( child )
49
+ @children << child
50
+ end
51
+
52
+ #
53
+ # Does this permutation have children?
54
+ #
55
+ def has_children?
56
+ not @children.empty?
57
+ end
58
+
59
+ #
60
+ # Remove any existing children. Called by the machines generate function
61
+ # to build a fresh tree in case generate was previously called.
62
+ #
63
+ def remove_children
64
+ @children.clear
65
+ end
66
+
67
+ #
68
+ # Actully render this permutation into a raw buffer.
69
+ #
70
+ def render
71
+ raw = ''
72
+ # Zero the length as we will be rendering the raw buffer and the length may change.
73
+ @length = 0
74
+ # If this permutation source is a Primitive/Procedure we can call it, otherwise we have a string
75
+ if( @source.kind_of?( Primitive ) or @source.kind_of?( ::Proc ) )
76
+ if( @source.kind_of?( Primitive ) )
77
+ raw = @source.call( @name, @machine, *@args )
78
+ elsif( @source.kind_of?( ::Proc ) )
79
+ raw = @source.call
80
+ end
81
+ # If the primitive/procedure returned an array, it is an array of assembly strings which we can assemble.
82
+ if( raw.kind_of?( ::Array ) )
83
+ lines = raw
84
+ raw = ''
85
+ # itterate over each line of assembly
86
+ lines.each do | asm |
87
+ # parse the asm and substitute in any offset values specified...
88
+ offsets = asm.scan( /:([\S]+)_offset/ )
89
+ offsets.each do | name, |
90
+ asm = asm.gsub( ":#{name}_offset", @machine.block_offset( name ).to_s )
91
+ end
92
+ # and substitute in and register values for any variables specified...
93
+ regs = asm.scan( /:([\S]+)_reg([\d]+)/ )
94
+ regs.each do | name, size |
95
+ asm = asm.gsub( ":#{name}_reg#{size}", @machine.variable_value( name, size.to_i ) )
96
+ end
97
+ # assemble it into a raw blob
98
+ blob = @machine.assemble( asm )
99
+ #if( not @machine.is_valid?( blob ) )
100
+ # p "#{name}(#{primitive}):#{asm} is invalid"
101
+ #end
102
+ raw << blob
103
+ end
104
+ end
105
+ else
106
+ # the source must just be a static string
107
+ raw = @source
108
+ end
109
+ # Update the length to reflect the new raw buffer
110
+ @length = raw.to_s.length
111
+ # As the temp variable is only assigned for the duration of a single permutation we
112
+ # can now release it if it was used in this permutation.
113
+ @machine.release_temp_variable
114
+ return raw.to_s
115
+ end
116
+
117
+ #
118
+ # Test if this permutation raw buffer is valid in this machine (e.g. against the badchar list).
119
+ #
120
+ def is_valid?
121
+ result = false
122
+ if( @valid )
123
+ begin
124
+ result = @machine.is_valid?( self.render )
125
+ rescue UnallowedPermutation
126
+ # This permutation is unallowed and can never be rendered so just mark it as
127
+ # not valid to skip it during future attempts.
128
+ @valid = false
129
+ rescue UndefinedPermutation
130
+ # allow an undefined permutation to fail validation but keep it marked
131
+ # as valid as it may be defined and passed validation later.
132
+ ensure
133
+ # Should a temporary variable have been assigned we can release it here.
134
+ @machine.release_temp_variable
135
+ end
136
+ end
137
+ return result
138
+ end
139
+
140
+ #
141
+ # Try to find a solution within the solution space by performing a depth first search
142
+ # into the permutation tree and backtracking when needed.
143
+ #
144
+ def solve
145
+ # Check to see if this permutation can make part of a valid solution
146
+ if( self.is_valid? )
147
+ # record this permutation as part of the final solution (the current machines register state is also saved here)
148
+ @machine.solution_push( self )
149
+ # If we have no children we are at the end of the tree and have a potential full solution.
150
+ if( not self.has_children? )
151
+ # We have a solution but doing a final pass to update offsets may introduce bad chars
152
+ # so we test for this and keep searching if this isnt a real solution after all.
153
+ if( not @machine.solution_is_valid? )
154
+ # remove this permutation and keep searching
155
+ @machine.solution_pop
156
+ return false
157
+ end
158
+ # Return true to unwind the recursive call as we have got a final solution.
159
+ return true
160
+ end
161
+ # Itterate over the children of this permutation (the perutations of the proceeding block).
162
+ @children.each do | child |
163
+ # Traverse into this child to keep trying to generate a solution...
164
+ if( child.solve )
165
+ # Keep returning true to unwind as we are done.
166
+ return true
167
+ end
168
+ end
169
+ # If we get here this permutation, origionally thought to be good for a solution, is not after all,
170
+ # so remove it from the machines final solution, restoring the register state aswell.
171
+ @machine.solution_pop
172
+ end
173
+ # No children can be made form part of the solution, return failure for this path in the tree.
174
+ return false
175
+ end
176
+
177
+ end
178
+
179
+ #
180
+ # A symbolic permutation to mark locations like the begining and end of a group of blocks.
181
+ # Used to calculate usefull offsets.
182
+ #
183
+ class SymbolicPermutation < Permutation
184
+ def initialize( name, machine, initial_offset=0 )
185
+ super( name, '', machine, '' )
186
+ # fudge the initial symbolic offset with a default (it gets patched correctly later),
187
+ # helps with the end symbolic block to not be 0 (as its a forward reference it really
188
+ # slows things down if we leave it 0)
189
+ @offset = initial_offset
190
+ # A symbolic block is allways active!
191
+ @active = true
192
+ end
193
+
194
+ #
195
+ # We block all attempts to set the active state of this permutation so as
196
+ # it is always true. This lets us always address the offset.
197
+ #
198
+ def active=( value )
199
+ end
200
+ end
201
+
202
+ #
203
+ # A primitive is a machine defined permutation which accepts some arguments when it is called.
204
+ #
205
+ class Primitive
206
+
207
+ #
208
+ # Initialize this primitive with its target source procedure and the machine it belongs to.
209
+ #
210
+ def initialize( source )
211
+ @source = source
212
+ end
213
+
214
+ #
215
+ # Call the primitives source procedure, passing in the arguments.
216
+ #
217
+ def call( name, machine, *args )
218
+ return @source.call( name, machine, *args )
219
+ end
220
+
221
+ end
222
+
223
+ #
224
+ #
225
+ #
226
+ class Block
227
+
228
+ #attr_accessor :next, :previous
229
+ attr_reader :name
230
+
231
+ def initialize( name )
232
+ @name = name
233
+ @next = nil
234
+ @previous = nil
235
+ @permutations = ::Array.new
236
+ end
237
+
238
+ def shuffle
239
+ @permutations = @permutations.shuffle
240
+ end
241
+
242
+ def solve
243
+ @permutations.first.solve
244
+ end
245
+
246
+ def << ( permutation )
247
+ @permutations << permutation
248
+ end
249
+
250
+ def each
251
+ @permutations.each do | permutation |
252
+ yield permutation
253
+ end
254
+ end
255
+
256
+ end
257
+
258
+ #
259
+ # A class to hold a solution for a Rex::Poly::Machine problem.
260
+ #
261
+ class Solution
262
+
263
+ attr_reader :offset
264
+
265
+ def initialize
266
+ @permutations = ::Array.new
267
+ @reg_state = ::Array.new
268
+ @offset = 0
269
+ end
270
+
271
+ #
272
+ # Reset this solution to an empty state.
273
+ #
274
+ def reset
275
+ @offset = 0
276
+ @permutations.each do | permutation |
277
+ permutation.active = false
278
+ permutation.offset = 0
279
+ end
280
+ @permutations.clear
281
+ @reg_state.clear
282
+ end
283
+
284
+ #
285
+ # Push a new permutation onto this solutions permutations list and save the associated register/variables state
286
+ #
287
+ def push( permutation, reg_available, reg_consumed, variables )
288
+ permutation.active = true
289
+ permutation.offset = @offset
290
+ @offset += permutation.length
291
+ @permutations.push( permutation )
292
+ @reg_state.push( [ [].concat(reg_available), [].concat(reg_consumed), {}.merge(variables) ] )
293
+ end
294
+
295
+ #
296
+ # Pop off the last permutaion and register/variables state from this solution.
297
+ #
298
+ def pop
299
+ reg_available, reg_consumed, variables = @reg_state.pop
300
+ permutation = @permutations.pop
301
+ permutation.active = false
302
+ permutation.offset = 0
303
+ @offset -= permutation.length
304
+ return permutation, reg_available, reg_consumed, variables
305
+ end
306
+
307
+ #
308
+ # Render the final buffer.
309
+ #
310
+ def buffer
311
+ previous_offset = nil
312
+ count = 0
313
+ # perform an N-pass fixup for offsets...
314
+ while( true ) do
315
+ # If we cant get the offsets fixed within a fixed ammount of tries we return
316
+ # nil to indicate failure and keep searching for a solution that will work.
317
+ if( count > 64 )
318
+ return nil
319
+ end
320
+ # Reset the solution offset so as to update it for this pass
321
+ @offset = 0
322
+ # perform a single pass to ensure we are using the correct offset values
323
+ @permutations.each do | permutation |
324
+ permutation.offset = @offset
325
+ # Note: calling render() can throw both UndefinedPermutation and UnallowedPermutation exceptions,
326
+ # however as we assume we only ever return the buffer once a final solution has been generated
327
+ # we should never have either of those exceptions thrown.
328
+ permutation.render
329
+ @offset += permutation.length
330
+ end
331
+ # If we have generated two consecutive passes which are the same length we can stop fixing up the offsets.
332
+ if( not previous_offset.nil? and @offset == previous_offset )
333
+ break
334
+ end
335
+ count +=1
336
+ previous_offset = @offset
337
+ end
338
+ # now a final pass to render the solution into the raw buffer
339
+ raw = ''
340
+ @permutations.each do | permutation |
341
+ #$stderr.puts "#{permutation.name} - #{ "0x%08X (%d)" % [ permutation.offset, permutation.length] } "
342
+ raw << permutation.render
343
+ end
344
+ return raw
345
+ end
346
+
347
+ end
348
+
349
+ #
350
+ # Create a new machine instance.
351
+ #
352
+ def initialize( badchars, cpu )
353
+ @badchars = badchars
354
+ @cpu = cpu
355
+
356
+ @reg_available = ::Array.new
357
+ @reg_consumed = ::Array.new
358
+ @variables = ::Hash.new
359
+ @blocks = ::Hash.new
360
+ @primitives = ::Hash.new
361
+ @solution = Solution.new
362
+
363
+ _create_primitives
364
+
365
+ @blocks['begin'] = Block.new( 'begin' )
366
+ @blocks['begin'] << SymbolicPermutation.new( 'begin', self )
367
+
368
+ _create_variable( 'temp' )
369
+ end
370
+
371
+ #
372
+ # Overloaded by a subclass to return the maximum native general register size supported.
373
+ #
374
+ def native_size
375
+ nil
376
+ end
377
+
378
+ #
379
+ # Use METASM to assemble a line of asm using this machines current cpu.
380
+ #
381
+ def assemble( asm )
382
+ return Metasm::Shellcode.assemble( @cpu, asm ).encode_string
383
+ end
384
+
385
+ #
386
+ # Check if a data blob is valid against the badchar list (or perform any other validation here)
387
+ #
388
+ def is_valid?( data )
389
+ if( data.nil? )
390
+ return false
391
+ end
392
+ return Rex::Text.badchar_index( data, @badchars ).nil?
393
+ end
394
+
395
+ #
396
+ # Generate a 64 bit number whoes bytes are valid in this machine.
397
+ #
398
+ def make_safe_qword( number=nil )
399
+ return _make_safe_number( QWORD, number ) & 0xFFFFFFFFFFFFFFFF
400
+ end
401
+
402
+ #
403
+ # Generate a 32 bit number whoes bytes are valid in this machine.
404
+ #
405
+ def make_safe_dword( number=nil )
406
+ return _make_safe_number( DWORD, number ) & 0xFFFFFFFF
407
+ end
408
+
409
+ #
410
+ # Generate a 16 bit number whoes bytes are valid in this machine.
411
+ #
412
+ def make_safe_word( number=nil )
413
+ return _make_safe_number( WORD, number ) & 0xFFFF
414
+ end
415
+
416
+ #
417
+ # Generate a 8 bit number whoes bytes are valid in this machine.
418
+ #
419
+ def make_safe_byte( number=nil )
420
+ return _make_safe_number( BYTE, number ) & 0xFF
421
+ end
422
+
423
+ #
424
+ # Create a variable by name which will be assigned a register during generation. We can
425
+ # optionally assign a static register value to a variable if needed.
426
+ #
427
+ def create_variable( name, reg=nil )
428
+ # Sanity check we aren't trying to create one of the reserved variables.
429
+ if( name == 'temp' )
430
+ raise RuntimeError, "Unable to create variable, '#{name}' is a reserved variable name."
431
+ end
432
+ return _create_variable( name, reg )
433
+ end
434
+
435
+ #
436
+ # If the temp variable was assigned we release it.
437
+ #
438
+ def release_temp_variable
439
+ if( @variables['temp'] )
440
+ regnum = @variables['temp']
441
+ # Sanity check the temp variable was actually assigned (it may not have been if the last permutation didnot use it)
442
+ if( regnum )
443
+ # place the assigned register back in the available list for consumption later.
444
+ @reg_available.push( @reg_consumed.delete( regnum ) )
445
+ # unasign the temp vars register
446
+ @variables['temp'] = nil
447
+ return true
448
+ end
449
+ end
450
+ return false
451
+ end
452
+
453
+ #
454
+ # Resolve a variable name into its currently assigned register value.
455
+ #
456
+ def variable_value( name, size=nil )
457
+ # Sanity check we this variable has been created
458
+ if( not @variables.has_key?( name ) )
459
+ raise RuntimeError, "Unknown register '#{name}'."
460
+ end
461
+ # Pull out its current register value if it has been assigned one
462
+ regnum = @variables[ name ]
463
+ if( not regnum )
464
+ regnum = @reg_available.pop
465
+ if( not regnum )
466
+ raise RuntimeError, "Unable to assign variable '#{name}' a register value, none available."
467
+ end
468
+ # and add it to the consumed list so we can track it later
469
+ @reg_consumed << regnum
470
+ # and now assign the variable the register
471
+ @variables[ name ] = regnum
472
+ end
473
+ # resolve the register number int a string representation (e.g. 0 in x86 is EAX if size is 32)
474
+ return _register_value( regnum, size )
475
+ end
476
+
477
+ #
478
+ # Check this solution is still currently valid (as offsets change it may not be).
479
+ #
480
+ def solution_is_valid?
481
+ return self.is_valid?( @solution.buffer )
482
+ end
483
+
484
+ #
485
+ # As the solution advances we save state for each permutation step in the solution. This lets
486
+ # use rewind at a later stage if the solving algorithm wishes to perform some backtracking.
487
+ #
488
+ def solution_push( permutation )
489
+ @solution.push( permutation, @reg_available, @reg_consumed, @variables )
490
+ end
491
+
492
+ #
493
+ # Backtrack one step in the solution and restore the register/variable state.
494
+ #
495
+ def solution_pop
496
+ permutation, @reg_available, @reg_consumed, @variables = @solution.pop
497
+
498
+ @reg_available.push( @reg_available.shift )
499
+ end
500
+
501
+ #
502
+ # Create a block by name and add in its list of permutations.
503
+ #
504
+ # XXX: this doesnt support the fuzzy order of block dependencies ala the origional rex::poly
505
+ def create_block( name, *permutation_sources )
506
+ # Sanity check we aren't trying to create one of the reserved symbolic blocks.
507
+ if( name == 'begin' or name == 'end' )
508
+ raise RuntimeError, "Unable to add block, '#{name}' is a reserved block name."
509
+ end
510
+ # If this is the first time this block is being created, create the block object to hold the permutation list
511
+ if( not @blocks[name] )
512
+ @blocks[name] = Block.new( name )
513
+ end
514
+ # Now create a new permutation object for every one supplied.
515
+ permutation_sources.each do | source |
516
+ @blocks[name] << Permutation.new( name, '', self, source )
517
+ end
518
+ return name
519
+ end
520
+
521
+ #
522
+ # Create a block which is based on a primitive defined by this machine.
523
+ #
524
+ def create_block_primitive( block_name, primitive_name, *args )
525
+ # Santiy check this primitive is actually available and is not an internal primitive (begins with an _).
526
+ if( not @primitives[primitive_name] or primitive_name[0] == "_" )
527
+ raise RuntimeError, "Unable to add block, Primitive '#{primitive_name}' is not available."
528
+ end
529
+ # Sanity check we aren't trying to create one of the reserved symbolic blocks.
530
+ if( block_name == 'begin' or block_name == 'end' )
531
+ raise RuntimeError, "Unable to add block, '#{block_name}' is a reserved block name."
532
+ end
533
+ return _create_block_primitive( block_name, primitive_name, *args )
534
+ end
535
+
536
+ #
537
+ # Get the offset for a blocks active permutation. This is easy for backward references as
538
+ # they will already have been rendered and their sizes known. For forward references we
539
+ # can't know in advance but the correct value can be known later once the final solution is
540
+ # available and a final pass to generate the raw buffer is made.
541
+ #
542
+ def block_offset( name )
543
+ if( name == 'end' )
544
+ return @solution.offset
545
+ elsif( @blocks[name] )
546
+ @blocks[name].each do | permutation |
547
+ if( permutation.active )
548
+ return permutation.offset
549
+ end
550
+ end
551
+ end
552
+ # If we are forward referencing a block it will be at least the current solutions offset +1
553
+ return @solution.offset + 1
554
+ end
555
+
556
+ #
557
+ # Does a given block exist?
558
+ #
559
+ def block_exist?( name )
560
+ return @blocks.include?( name )
561
+ end
562
+
563
+ #
564
+ # Does a given block exist?
565
+ #
566
+ def variable_exist?( name )
567
+ return @variables.include?( name )
568
+ end
569
+
570
+ # XXX: ambiguity between variable names and block name may introduce confusion!!! make them be unique.
571
+
572
+ #
573
+ # Resolve a given value into either a number literal, a block offset or
574
+ # a variables assigned register.
575
+ #
576
+ def resolve_value( value, size=nil )
577
+ if( block_exist?( value ) )
578
+ return block_offset( value )
579
+ elsif( variable_exist?( value ) )
580
+ return variable_value( value, size )
581
+ end
582
+ return value.to_i
583
+ end
584
+
585
+ #
586
+ # Get the block previous to the target block.
587
+ #
588
+ def block_previous( target_block )
589
+ previous_block = nil
590
+ @blocks.each_key do | current_block |
591
+ if( current_block == target_block )
592
+ return previous_block
593
+ end
594
+ previous_block = current_block
595
+ end
596
+ return nil
597
+ end
598
+
599
+ #
600
+ # Get the block next to the target block.
601
+ #
602
+ def block_next( target_block )
603
+ @blocks.each_key do | current_block |
604
+ if( block_previous( current_block ) == target_block )
605
+ return current_block
606
+ end
607
+ end
608
+ return nil
609
+ end
610
+
611
+ #
612
+ # Try to generate a solution.
613
+ #
614
+ def generate
615
+
616
+ if( @blocks.has_key?( 'end' ) )
617
+ @blocks.delete( 'end' )
618
+ end
619
+
620
+ @blocks['end'] = Block.new( 'end' )
621
+ @blocks['end'] << SymbolicPermutation.new( 'end', self, 1 )
622
+
623
+ # Mix up the permutation orders for each block and create the tree structure.
624
+ previous = ::Array.new
625
+ @blocks.each_value do | block |
626
+ # Shuffle the order of the blocks permutations.
627
+ block.shuffle
628
+ # create the tree by adding the current blocks permutations as children of the previous block.
629
+ current = ::Array.new
630
+ block.each do | permutation |
631
+ permutation.remove_children
632
+ previous.each do | prev |
633
+ prev.add_child( permutation )
634
+ end
635
+ current << permutation
636
+ end
637
+ previous = current
638
+ end
639
+
640
+ # Shuffle the order of the available registers
641
+ @reg_available = @reg_available.shuffle
642
+
643
+ # We must try every permutation of the register orders, so if we fail to
644
+ # generate a solution we rotate the available registers to try again with
645
+ # a different order. This ensures we perform and exhaustive search.
646
+ 0.upto( @reg_available.length - 1 ) do
647
+
648
+ @solution.reset
649
+
650
+ # Start from the root node in the solution space and generate a
651
+ # solution by traversing the solution space's tree structure.
652
+ if( @blocks['begin'].solve )
653
+ # Return the solutions buffer (perform a last pass to fixup all offsets)...
654
+ return @solution.buffer
655
+ end
656
+
657
+ @reg_available.push( @reg_available.shift )
658
+ end
659
+
660
+ # :(
661
+ nil
662
+ end
663
+
664
+ #
665
+ # An UndefinedPermutation exception is raised when a permutation can't render yet
666
+ # as the conditions required are not yet satisfied.
667
+ #
668
+ class UndefinedPermutation < RuntimeError
669
+ def initialize( msg=nil )
670
+ super
671
+ end
672
+ end
673
+
674
+ #
675
+ # An UnallowedPermutation exception is raised when a permutation can't ever render
676
+ # as the conditions supplied are impossible to satisfy.
677
+ #
678
+ class UnallowedPermutation < RuntimeError
679
+ def initialize( msg=nil )
680
+ super
681
+ end
682
+ end
683
+
684
+ #
685
+ # An InvalidPermutation exception is raised when a permutation receives a invalid
686
+ # argument and cannot continue to render. This is a fatal exception.
687
+ #
688
+ class InvalidPermutation < RuntimeError
689
+ def initialize( msg=nil )
690
+ super
691
+ end
692
+ end
693
+
694
+ protected
695
+
696
+ #
697
+ # Overloaded by a subclass to resolve a register number into a suitable register
698
+ # name for the target architecture. E.g on x64 the register number 0 with size 64
699
+ # would resolve to RCX. Size is nil by default to indicate we want the default
700
+ # machine size, e.g. 32bit DWORD on x86 or 64bit QWORD on x64.
701
+ #
702
+ def _register_value( regnum, size=nil )
703
+ nil
704
+ end
705
+
706
+ #
707
+ # Perform the actual variable creation.
708
+ #
709
+ def _create_variable( name, reg=nil )
710
+ regnum = nil
711
+ # Sanity check this variable has not already been created.
712
+ if( @variables[name] )
713
+ raise RuntimeError, "Variable '#{name}' is already created."
714
+ end
715
+ # If a fixed register is being assigned to this variable then resolve it
716
+ if( reg )
717
+ # Resolve the register name into a register number
718
+ @reg_available.each do | num |
719
+ if( _register_value( num ) == reg.downcase )
720
+ regnum = num
721
+ break
722
+ end
723
+ end
724
+ # If an invalid register name was given or the chosen register is not available we must fail.
725
+ if( not regnum )
726
+ raise RuntimeError, "Register '#{reg}' is unknown or unavailable."
727
+ end
728
+ # Sanity check another variable isnt assigned this register
729
+ if( @variables.has_value?( regnum ) )
730
+ raise RuntimeError, "Register number '#{regnum}' is already consumed by variable '#{@variables[name]}'."
731
+ end
732
+ # Finally we consume the register chosen so we dont select it again later.
733
+ @reg_consumed << @reg_available.delete( regnum )
734
+ end
735
+ # Create the variable and assign it a register number (or nil if not yet assigned)
736
+ @variables[name] = regnum
737
+ return name
738
+ end
739
+
740
+ #
741
+ # Create a block which is based on a primitive defined by this machine.
742
+ #
743
+ def _create_block_primitive( block_name, primitive_name, *args )
744
+ # If this is the first time this block is being created, create the array to hold the permutation list
745
+ if( not @blocks[block_name] )
746
+ @blocks[block_name] = Block.new( block_name )
747
+ end
748
+ # Now create a new permutation object for every one supplied.
749
+ @primitives[primitive_name].each do | source |
750
+ @blocks[block_name] << Permutation.new( block_name, primitive_name, self, source, args )
751
+ end
752
+ return block_name
753
+ end
754
+
755
+ #
756
+ # Overloaded by a subclass to create any primitives available in this machine.
757
+ #
758
+ def _create_primitives
759
+ nil
760
+ end
761
+
762
+ #
763
+ # Rex::Poly::Machine::Primitive
764
+ #
765
+ def _create_primitive( name, *permutations )
766
+ # If this is the first time this primitive is being created, create the array to hold the permutation list
767
+ if( not @primitives[name] )
768
+ @primitives[name] = ::Array.new
769
+ end
770
+ # Add in the permutation object (Rex::Poly::Machine::Primitive) for every one supplied.
771
+ permutations.each do | permutation |
772
+ @primitives[name] << Primitive.new( permutation )
773
+ end
774
+ end
775
+
776
+ #
777
+ # Helper function to generate a number whoes byte representation is valid in this
778
+ # machine (does not contain any badchars for example). Optionally we can supply a
779
+ # number and the resulting addition/subtraction of this number against the newly
780
+ # generated value is also tested for validity. This helps in the assembly primitives
781
+ # which can use these values.
782
+ #
783
+ def _make_safe_number( bytes, number=nil )
784
+ format = ''
785
+ if( bytes == BYTE )
786
+ format = 'C'
787
+ elsif( bytes == WORD )
788
+ format = 'v'
789
+ elsif( bytes == DWORD )
790
+ format = 'V'
791
+ elsif( bytes == QWORD )
792
+ format = 'Q'
793
+ else
794
+ raise RuntimeError, "Invalid size '#{bytes}' used in _make_safe_number."
795
+ end
796
+
797
+ goodchars = (0..255).to_a
798
+
799
+ @badchars.unpack( 'C*' ).each do | b |
800
+ goodchars.delete( b.chr )
801
+ end
802
+
803
+ while( true ) do
804
+ value = 0
805
+
806
+ 0.upto( bytes-1 ) do | i |
807
+ value |= ( (goodchars[ rand(goodchars.length) ] << i*8) & (0xFF << i*8) )
808
+ end
809
+
810
+ if( not is_valid?( [ value ].pack(format) ) or not is_valid?( [ ~value ].pack(format) ) )
811
+ redo
812
+ end
813
+
814
+ if( not number.nil? )
815
+ if( not is_valid?( [ value + number ].pack(format) ) or not is_valid?( [ value - number ].pack(format) ) )
816
+ redo
817
+ end
818
+ end
819
+
820
+ break
821
+ end
822
+
823
+ return value
824
+ end
825
+
826
+ end
827
+
828
+ end
829
+
830
+ end