librex 0.0.68 → 0.0.70

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 +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