librex 0.0.68 → 0.0.70

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