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
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  require 'rex/encoder/alpha2/generic'
@@ -8,117 +7,117 @@ module Encoder
8
7
  module Alpha2
9
8
 
10
9
  class UnicodeUpper < Generic
11
- def self.default_accepted_chars ; ('B' .. 'Z').to_a + ('0' .. '9').to_a ; end
12
-
13
- def self.gen_second(block, base)
14
- # unicode uses additive encoding
15
- (block - base)
16
- end
10
+ def self.default_accepted_chars ; ('B' .. 'Z').to_a + ('0' .. '9').to_a ; end
17
11
 
18
- def self.gen_decoder_prefix(reg, offset)
19
- if (offset > 6)
20
- raise "Critical: Offset is greater than 6"
21
- end
12
+ def self.gen_second(block, base)
13
+ # unicode uses additive encoding
14
+ (block - base)
15
+ end
22
16
 
23
- # offset untested for unicode :(
24
- if (offset <= 4)
25
- nop = 'CP' * offset
26
- mod = 'IA' * (4 - offset) + nop # dec ecx,,, push ecx, pop edx
27
- else
28
- mod = 'AA' * (offset - 4) # inc ecx
29
- nop = 'CP' * (4 - mod.length)
30
- mod += nop
31
- end
17
+ def self.gen_decoder_prefix(reg, offset)
18
+ if (offset > 6)
19
+ raise "Critical: Offset is greater than 6"
20
+ end
32
21
 
33
- regprefix = { # nops ignored below
34
- 'EAX' => 'PPYA' + mod, # push eax, pop ecx
35
- 'ECX' => mod + '4444', # dec ecx
36
- 'EDX' => 'RRYA' + mod, # push edx, pop ecx
37
- 'EBX' => 'SSYA' + mod, # push ebx, pop ecx
38
- 'ESP' => 'TUYA' + mod, # push esp, pop ecx
39
- 'EBP' => 'UUYA' + mod, # push ebp, pop ecx
40
- 'ESI' => 'VVYA' + mod, # push esi, pop ecx
41
- 'EDI' => 'WWYA' + mod, # push edi, pop edi
42
- '[ESP]' => 'YA' + mod + '44', #
43
- '[ESP+4]' => 'YUYA' + mod, #
44
- }
22
+ # offset untested for unicode :(
23
+ if (offset <= 4)
24
+ nop = 'CP' * offset
25
+ mod = 'IA' * (4 - offset) + nop # dec ecx,,, push ecx, pop edx
26
+ else
27
+ mod = 'AA' * (offset - 4) # inc ecx
28
+ nop = 'CP' * (4 - mod.length)
29
+ mod += nop
30
+ end
45
31
 
46
- return regprefix[reg]
47
- end
32
+ regprefix = { # nops ignored below
33
+ 'EAX' => 'PPYA' + mod, # push eax, pop ecx
34
+ 'ECX' => mod + '4444', # dec ecx
35
+ 'EDX' => 'RRYA' + mod, # push edx, pop ecx
36
+ 'EBX' => 'SSYA' + mod, # push ebx, pop ecx
37
+ 'ESP' => 'TUYA' + mod, # push esp, pop ecx
38
+ 'EBP' => 'UUYA' + mod, # push ebp, pop ecx
39
+ 'ESI' => 'VVYA' + mod, # push esi, pop ecx
40
+ 'EDI' => 'WWYA' + mod, # push edi, pop edi
41
+ '[ESP]' => 'YA' + mod + '44', #
42
+ '[ESP+4]' => 'YUYA' + mod, #
43
+ }
48
44
 
49
- def self.gen_decoder(reg, offset)
50
- decoder =
51
- gen_decoder_prefix(reg, offset) +
52
- "QA" + # push ecx, NOP
53
- "TA" + # push esp, NOP
54
- "XA" + # pop eax, NOP
55
- "ZA" + # pop edx, NOP
56
- "PU" + # push eax, NOP
57
- "3" + # xor eax, [eax]
58
- "QA" + # push ecx, NOP
59
- "DA" + # inc esp, NOP
60
- "ZA" + # pop edx, NOP
61
- "BA" + # inc edx, NOP
62
- "RA" + # push edx, NOP
63
- "LA" + # dec esp, NOP
64
- "YA" + # pop ecx, NOP
65
- "IA" + # dec ecx, NOP
66
- "QA" + # push ecx, NOP
67
- "IA" + # dec ecx, NOP
68
- "QA" + # push ecx, NOP
69
- "PA" + # push eax, NOP
70
- "5AAA" + # xor eax, 41004100 - NOP
71
- "PA" + # push eax, NOP
72
- "Z" + # pop edx
73
- "1A" + # add [ecx], dh - NOP
74
- "I" + # dec ecx
75
- "1A" + # add [ecx], dh - NOP
76
- "IA" + # dec ecx, NOP
77
- "IA" + # dec ecx, NOP
78
- "J" + # dec edx
79
- "1" + # add [ecx], dh
80
- "1A" + # add [ecx], dh - NOP
81
- "IA" + # dec ecx, NOP
82
- "IA" + # dec ecx, NOP
83
- "XA" + # pop eax, NOP
84
- "58AA" + # xor eax, 41003800 - NOP
85
- "PA" + # push eax, NOP
86
- "ZA" + # pop edx, NOP
87
- "BA" + # inc edx, NOP
88
- "B" + # inc edx
89
- "Q" + # add [ecx], dl
90
- "I" + # dec ecx
91
- "1A" + # add [ecx], dh - NOP
92
- "I" + # dec ecx
93
- "Q" + # add [ecx], dl
94
- "IA" + # dec ecx, NOP
95
- "I" + # dec ecx
96
- "Q" + # add [ecx], dl
97
- "I" + # dec ecx
98
- "1" + # add [ecx], dh
99
- "1" + # add [ecx], dh
100
- "1" + # add [ecx], dh
101
- "1A" + # add [ecx], dh - NOP
102
- "IA" + # dec ecx, NOP
103
- "J" + # dec edx
104
- "Q" + # add [ecx], dl
105
- "I" + # dec edx
106
- "1A" + # add [ecx], dh - NOP
107
- "YA" + # pop ecx, NOP
108
- "ZB" + # pop edx, NOP
109
- "AB" + # inc ecx, NOP <-------
110
- "AB" + # inc ecx, NOP |
111
- "AB" + # inc ecx, NOP |
112
- "AB" + # inc ecx, NOP |
113
- "30" + # imul eax, [ecx], 10 * |
114
- "A" + # add al, [ecx+2] * |
115
- "P" + # mov [edx], al * |
116
- "B" + # inc edx |
117
- "9" + # cmp [ecx], 41 * |
118
- "4" + # jnz --------------------
119
- "4JB"
45
+ return regprefix[reg]
46
+ end
120
47
 
121
- return decoder
122
- end
48
+ def self.gen_decoder(reg, offset)
49
+ decoder =
50
+ gen_decoder_prefix(reg, offset) +
51
+ "QA" + # push ecx, NOP
52
+ "TA" + # push esp, NOP
53
+ "XA" + # pop eax, NOP
54
+ "ZA" + # pop edx, NOP
55
+ "PU" + # push eax, NOP
56
+ "3" + # xor eax, [eax]
57
+ "QA" + # push ecx, NOP
58
+ "DA" + # inc esp, NOP
59
+ "ZA" + # pop edx, NOP
60
+ "BA" + # inc edx, NOP
61
+ "RA" + # push edx, NOP
62
+ "LA" + # dec esp, NOP
63
+ "YA" + # pop ecx, NOP
64
+ "IA" + # dec ecx, NOP
65
+ "QA" + # push ecx, NOP
66
+ "IA" + # dec ecx, NOP
67
+ "QA" + # push ecx, NOP
68
+ "PA" + # push eax, NOP
69
+ "5AAA" + # xor eax, 41004100 - NOP
70
+ "PA" + # push eax, NOP
71
+ "Z" + # pop edx
72
+ "1A" + # add [ecx], dh - NOP
73
+ "I" + # dec ecx
74
+ "1A" + # add [ecx], dh - NOP
75
+ "IA" + # dec ecx, NOP
76
+ "IA" + # dec ecx, NOP
77
+ "J" + # dec edx
78
+ "1" + # add [ecx], dh
79
+ "1A" + # add [ecx], dh - NOP
80
+ "IA" + # dec ecx, NOP
81
+ "IA" + # dec ecx, NOP
82
+ "XA" + # pop eax, NOP
83
+ "58AA" + # xor eax, 41003800 - NOP
84
+ "PA" + # push eax, NOP
85
+ "ZA" + # pop edx, NOP
86
+ "BA" + # inc edx, NOP
87
+ "B" + # inc edx
88
+ "Q" + # add [ecx], dl
89
+ "I" + # dec ecx
90
+ "1A" + # add [ecx], dh - NOP
91
+ "I" + # dec ecx
92
+ "Q" + # add [ecx], dl
93
+ "IA" + # dec ecx, NOP
94
+ "I" + # dec ecx
95
+ "Q" + # add [ecx], dl
96
+ "I" + # dec ecx
97
+ "1" + # add [ecx], dh
98
+ "1" + # add [ecx], dh
99
+ "1" + # add [ecx], dh
100
+ "1A" + # add [ecx], dh - NOP
101
+ "IA" + # dec ecx, NOP
102
+ "J" + # dec edx
103
+ "Q" + # add [ecx], dl
104
+ "I" + # dec edx
105
+ "1A" + # add [ecx], dh - NOP
106
+ "YA" + # pop ecx, NOP
107
+ "ZB" + # pop edx, NOP
108
+ "AB" + # inc ecx, NOP <-------
109
+ "AB" + # inc ecx, NOP |
110
+ "AB" + # inc ecx, NOP |
111
+ "AB" + # inc ecx, NOP |
112
+ "30" + # imul eax, [ecx], 10 * |
113
+ "A" + # add al, [ecx+2] * |
114
+ "P" + # mov [edx], al * |
115
+ "B" + # inc edx |
116
+ "9" + # cmp [ecx], 41 * |
117
+ "4" + # jnz --------------------
118
+ "4JB"
119
+
120
+ return decoder
121
+ end
123
122
 
124
123
  end end end end
@@ -0,0 +1,326 @@
1
+
2
+ require 'rex/poly/machine'
3
+
4
+ module Rex
5
+
6
+ module Encoder
7
+
8
+ class BloXor < Msf::Encoder
9
+
10
+ def initialize( *args )
11
+ super
12
+ @machine = nil
13
+ @blocks_out = []
14
+ @block_size = 0
15
+ end
16
+
17
+ #
18
+ #
19
+ #
20
+ def decoder_stub( state )
21
+
22
+ if( not state.decoder_stub )
23
+ @blocks_out = []
24
+ @block_size = 0
25
+
26
+ # XXX: It would be ideal to use a random block size but unless we know the maximum size our final encoded
27
+ # blob can be we should instead start with the smallest block size and go up to avoid generating
28
+ # anything too big (if we knew the max size we could try something smaller if we generated a blob too big)
29
+ #block_sizes = (1..state.buf.length).to_a.shuffle
30
+ #block_sizes.each do | len |
31
+
32
+ 1.upto( state.buf.length ) do | len |
33
+
34
+ # For now we ignore all odd sizes to help with performance (The rex poly machine
35
+ # doesnt have many load/store primitives that can handle byte sizes efficiently)
36
+ if( len % 2 != 0 )
37
+ next
38
+ end
39
+
40
+ blocks, size = compute_encoded( state, len )
41
+ if( blocks and size )
42
+
43
+ # We sanity check that the newly generated block ammount and the block size
44
+ # are not in the badchar list when converted into a hex form. Helps speed
45
+ # things up a great deal when generating a decoder stub later as these
46
+ # values may be used throughout.
47
+
48
+ if( not number_is_valid?( state, blocks.length - 1 ) or not number_is_valid?( state, ~( blocks.length - 1 ) ) )
49
+ next
50
+ end
51
+
52
+ if( not number_is_valid?( state, size ) or not number_is_valid?( state, ~size ) )
53
+ next
54
+ end
55
+
56
+ @blocks_out = blocks
57
+ @block_size = size
58
+
59
+ break
60
+ end
61
+ end
62
+
63
+ raise RuntimeError, "Unable to generate seed block." if( @blocks_out.empty? )
64
+
65
+ state.decoder_stub = compute_decoder( state )
66
+ end
67
+
68
+ state.decoder_stub
69
+ end
70
+
71
+ #
72
+ #
73
+ #
74
+ def encode_block( state, data )
75
+
76
+ buffer = ''
77
+
78
+ @blocks_out.each do | block |
79
+ buffer << block.pack( 'C*' )
80
+ end
81
+
82
+ buffer
83
+ end
84
+
85
+ protected
86
+
87
+ #
88
+ # Is a number in its byte form valid against the badchars?
89
+ #
90
+ def number_is_valid?( state, number )
91
+ size = 'C'
92
+ if( number > 0xFFFF )
93
+ size = 'V'
94
+ elsif( number > 0xFF )
95
+ size = 'v'
96
+ end
97
+ return Rex::Text.badchar_index( [ number ].pack( size ), state.badchars ).nil?
98
+ end
99
+
100
+ #
101
+ # Calculate Shannon's entropy.
102
+ #
103
+ def entropy( data )
104
+ entropy = 0.to_f
105
+ (0..255).each do | byte |
106
+ freq = data.to_s.count( byte.chr ).to_f / data.to_s.length
107
+ if( freq > 0 )
108
+ entropy -= freq * Math.log2( freq )
109
+ end
110
+ end
111
+ return entropy / 8
112
+ end
113
+
114
+ #
115
+ # Compute the encoded blocks (and associated seed)
116
+ #
117
+ def compute_encoded( state, len )
118
+
119
+ blocks_in = ::Array.new
120
+
121
+ input = '' << state.buf
122
+
123
+ block_padding = ( input.length % len ) > 0 ? len - ( input.length % len ) : 0
124
+
125
+ if( block_padding > 0 )
126
+ 0.upto( block_padding-1 ) do
127
+ input << [ rand( 255 ) ].pack( 'C' )
128
+ end
129
+ end
130
+
131
+ while( input.length > 0 )
132
+ blocks_in << input[0..len-1].unpack( 'C*' )
133
+ input = input[len..input.length]
134
+ end
135
+
136
+ seed = compute_seed( blocks_in, len, block_padding, state.badchars.unpack( 'C*' ) )
137
+
138
+ if( not seed )
139
+ return [ nil, nil ]
140
+ end
141
+
142
+ blocks_out = [ seed ]
143
+
144
+ blocks_in.each do | block |
145
+ blocks_out << compute_block( blocks_out.last, block )
146
+ end
147
+
148
+ return [ blocks_out, len ]
149
+ end
150
+
151
+ #
152
+ # Generate the decoder stub which is functionally equivalent to the following:
153
+ #
154
+ # source = &end;
155
+ # dest = source + BLOCK_SIZE;
156
+ # counter = BLOCK_COUNT * ( BLOCK_SIZE / chunk_size );
157
+ # do
158
+ # {
159
+ # encoded = *(CHUNK_SIZE *)dest;
160
+ # dest += chunk_size;
161
+ # decoded = *(CHUNK_SIZE *)source;
162
+ # *(CHUNK_SIZE *)source = decoded ^ encoded;
163
+ # source += chunk_size;
164
+ # } while( --counter );
165
+ #
166
+ # end:
167
+ #
168
+ def compute_decoder( state )
169
+
170
+ @machine.create_variable( 'source' )
171
+ @machine.create_variable( 'dest' )
172
+ @machine.create_variable( 'counter' )
173
+ @machine.create_variable( 'encoded' )
174
+ @machine.create_variable( 'decoded' )
175
+
176
+ chunk_size = Rex::Poly::Machine::BYTE
177
+ if( @machine.native_size() == Rex::Poly::Machine::QWORD )
178
+ if( @block_size % Rex::Poly::Machine::QWORD == 0 )
179
+ chunk_size = Rex::Poly::Machine::QWORD
180
+ elsif( @block_size % Rex::Poly::Machine::DWORD == 0 )
181
+ chunk_size = Rex::Poly::Machine::DWORD
182
+ elsif( @block_size % Rex::Poly::Machine::WORD == 0 )
183
+ chunk_size = Rex::Poly::Machine::WORD
184
+ end
185
+ elsif( @machine.native_size() == Rex::Poly::Machine::DWORD )
186
+ if( @block_size % Rex::Poly::Machine::DWORD == 0 )
187
+ chunk_size = Rex::Poly::Machine::DWORD
188
+ elsif( @block_size % Rex::Poly::Machine::WORD == 0 )
189
+ chunk_size = Rex::Poly::Machine::WORD
190
+ end
191
+ elsif( @machine.native_size() == Rex::Poly::Machine::WORD )
192
+ if( @block_size % Rex::Poly::Machine::WORD == 0 )
193
+ chunk_size = Rex::Poly::Machine::WORD
194
+ end
195
+ end
196
+
197
+ # Block 1 - Set the source variable to the address of the start block
198
+ @machine.create_block_primitive( 'block1', 'set', 'source', 'location' )
199
+
200
+ # Block 2 - Set the source variable to the address of the 1st encoded block
201
+ @machine.create_block_primitive( 'block2', 'add', 'source', 'end' )
202
+
203
+ # Block 3 - Set the destingation variable to the value of the source variable
204
+ @machine.create_block_primitive( 'block3', 'set', 'dest', 'source' )
205
+
206
+ # Block 4 - Set the destingation variable to the address of the 2nd encoded block
207
+ @machine.create_block_primitive( 'block4', 'add', 'dest', @block_size )
208
+
209
+ # Block 5 - Sets the loop counter to the number of blocks to process
210
+ @machine.create_block_primitive( 'block5', 'set', 'counter', ( ( @block_size / chunk_size ) * (@blocks_out.length - 1) ) )
211
+
212
+ # Block 6 - Set the encoded variable to the byte pointed to by the dest variable
213
+ @machine.create_block_primitive( 'block6', 'load', 'encoded', 'dest', chunk_size )
214
+
215
+ # Block 7 - Increment the destination variable by one
216
+ @machine.create_block_primitive( 'block7', 'add', 'dest', chunk_size )
217
+
218
+ # Block 8 - Set the decoded variable to the byte pointed to by the source variable
219
+ @machine.create_block_primitive( 'block8', 'load', 'decoded', 'source', chunk_size )
220
+
221
+ # Block 9 - Xor the decoded variable with the encoded variable
222
+ @machine.create_block_primitive( 'block9', 'xor', 'decoded', 'encoded' )
223
+
224
+ # Block 10 - store the newly decoded byte
225
+ @machine.create_block_primitive( 'block10', 'store', 'source', 'decoded', chunk_size )
226
+
227
+ # Block 11 - Increment the source variable by one
228
+ @machine.create_block_primitive( 'block11', 'add', 'source', chunk_size )
229
+
230
+ # Block 12 - Jump back up to the outer_loop block while the counter variable > 0
231
+ @machine.create_block_primitive( 'block12', 'loop', 'counter', 'block6' )
232
+
233
+ # Try to generate the decoder stub...
234
+ decoder = @machine.generate
235
+
236
+ if( not decoder )
237
+ raise RuntimeError, "Unable to generate decoder stub."
238
+ end
239
+
240
+ decoder
241
+ end
242
+
243
+ #
244
+ # Compute the seed block which will successfully decode all proceeding encoded
245
+ # blocks while ensuring the encoded blocks do not contain any badchars.
246
+ #
247
+ def compute_seed( blocks_in, block_size, block_padding, badchars )
248
+ seed = []
249
+ redo_bytes = []
250
+
251
+ 0.upto( block_size-1 ) do | index |
252
+
253
+ seed_bytes = (0..255).sort_by do
254
+ rand()
255
+ end
256
+
257
+ seed_bytes.each do | seed_byte |
258
+
259
+ next if( badchars.include?( seed_byte ) )
260
+
261
+ success = true
262
+
263
+ previous_byte = seed_byte
264
+
265
+ if( redo_bytes.length < 256 )
266
+ redo_bytes = (0..255).sort_by do
267
+ rand()
268
+ end
269
+ end
270
+
271
+ blocks_in.each do | block |
272
+
273
+ decoded_byte = block[ index ]
274
+
275
+ encoded_byte = previous_byte ^ decoded_byte
276
+
277
+ if( badchars.include?( encoded_byte ) )
278
+ # the padding bytes we added earlier can be changed if they are causing us to fail.
279
+ if( block == blocks_in.last and index >= (block_size-block_padding) )
280
+ if( redo_bytes.empty? )
281
+ success = false
282
+ break
283
+ end
284
+ block[ index ] = redo_bytes.shift
285
+ redo
286
+ end
287
+
288
+ success = false
289
+ break
290
+ end
291
+
292
+ previous_byte = encoded_byte
293
+ end
294
+
295
+ if( success )
296
+ seed << seed_byte
297
+ break
298
+ end
299
+ end
300
+
301
+ end
302
+
303
+ if( seed.length == block_size )
304
+ return seed
305
+ end
306
+
307
+ return nil
308
+ end
309
+
310
+ #
311
+ # Compute the next encoded block by xoring the previous
312
+ # encoded block with the next decoded block.
313
+ #
314
+ def compute_block( encoded, decoded )
315
+ block = []
316
+ 0.upto( encoded.length-1 ) do | index |
317
+ block << ( encoded[ index ] ^ decoded[ index ] )
318
+ end
319
+ return block
320
+ end
321
+
322
+ end
323
+
324
+ end
325
+
326
+ end