librex 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. data/README +4 -0
  2. data/lib/rex.rb +101 -0
  3. data/lib/rex.rb.ts.rb +70 -0
  4. data/lib/rex/LICENSE +29 -0
  5. data/lib/rex/arch.rb +103 -0
  6. data/lib/rex/arch/sparc.rb +75 -0
  7. data/lib/rex/arch/sparc.rb.ut.rb +18 -0
  8. data/lib/rex/arch/x86.rb +513 -0
  9. data/lib/rex/arch/x86.rb.ut.rb +93 -0
  10. data/lib/rex/assembly/nasm.rb +100 -0
  11. data/lib/rex/assembly/nasm.rb.ut.rb +22 -0
  12. data/lib/rex/codepage.map +104 -0
  13. data/lib/rex/compat.rb +281 -0
  14. data/lib/rex/constants.rb +113 -0
  15. data/lib/rex/elfparsey.rb +11 -0
  16. data/lib/rex/elfparsey/elf.rb +123 -0
  17. data/lib/rex/elfparsey/elfbase.rb +260 -0
  18. data/lib/rex/elfparsey/exceptions.rb +27 -0
  19. data/lib/rex/elfscan.rb +12 -0
  20. data/lib/rex/elfscan/scanner.rb +207 -0
  21. data/lib/rex/elfscan/search.rb +46 -0
  22. data/lib/rex/encoder/alpha2.rb +31 -0
  23. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  24. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  25. data/lib/rex/encoder/alpha2/generic.rb +113 -0
  26. data/lib/rex/encoder/alpha2/unicode_mixed.rb +117 -0
  27. data/lib/rex/encoder/alpha2/unicode_upper.rb +129 -0
  28. data/lib/rex/encoder/ndr.rb +89 -0
  29. data/lib/rex/encoder/ndr.rb.ut.rb +44 -0
  30. data/lib/rex/encoder/nonalpha.rb +61 -0
  31. data/lib/rex/encoder/nonupper.rb +64 -0
  32. data/lib/rex/encoder/xdr.rb +106 -0
  33. data/lib/rex/encoder/xdr.rb.ut.rb +29 -0
  34. data/lib/rex/encoder/xor.rb +69 -0
  35. data/lib/rex/encoder/xor/dword.rb +13 -0
  36. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  37. data/lib/rex/encoders/xor_dword.rb +35 -0
  38. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  39. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +12 -0
  40. data/lib/rex/encoding/xor.rb +20 -0
  41. data/lib/rex/encoding/xor.rb.ts.rb +14 -0
  42. data/lib/rex/encoding/xor/byte.rb +15 -0
  43. data/lib/rex/encoding/xor/byte.rb.ut.rb +21 -0
  44. data/lib/rex/encoding/xor/dword.rb +21 -0
  45. data/lib/rex/encoding/xor/dword.rb.ut.rb +15 -0
  46. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  47. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +15 -0
  48. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  49. data/lib/rex/encoding/xor/generic.rb +146 -0
  50. data/lib/rex/encoding/xor/generic.rb.ut.rb +120 -0
  51. data/lib/rex/encoding/xor/qword.rb +15 -0
  52. data/lib/rex/encoding/xor/word.rb +21 -0
  53. data/lib/rex/encoding/xor/word.rb.ut.rb +13 -0
  54. data/lib/rex/exceptions.rb +275 -0
  55. data/lib/rex/exceptions.rb.ut.rb +44 -0
  56. data/lib/rex/exploitation/cmdstager.rb +133 -0
  57. data/lib/rex/exploitation/egghunter.rb +143 -0
  58. data/lib/rex/exploitation/egghunter.rb.ut.rb +25 -0
  59. data/lib/rex/exploitation/encryptjs.rb +77 -0
  60. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  61. data/lib/rex/exploitation/heaplib.rb +94 -0
  62. data/lib/rex/exploitation/javascriptosdetect.rb +735 -0
  63. data/lib/rex/exploitation/obfuscatejs.rb +335 -0
  64. data/lib/rex/exploitation/opcodedb.rb +818 -0
  65. data/lib/rex/exploitation/opcodedb.rb.ut.rb +279 -0
  66. data/lib/rex/exploitation/seh.rb +92 -0
  67. data/lib/rex/exploitation/seh.rb.ut.rb +19 -0
  68. data/lib/rex/file.rb +84 -0
  69. data/lib/rex/file.rb.ut.rb +16 -0
  70. data/lib/rex/image_source.rb +12 -0
  71. data/lib/rex/image_source/disk.rb +60 -0
  72. data/lib/rex/image_source/image_source.rb +46 -0
  73. data/lib/rex/image_source/memory.rb +37 -0
  74. data/lib/rex/io/bidirectional_pipe.rb +157 -0
  75. data/lib/rex/io/datagram_abstraction.rb +35 -0
  76. data/lib/rex/io/stream.rb +313 -0
  77. data/lib/rex/io/stream_abstraction.rb +186 -0
  78. data/lib/rex/io/stream_server.rb +211 -0
  79. data/lib/rex/job_container.rb +202 -0
  80. data/lib/rex/logging.rb +4 -0
  81. data/lib/rex/logging/log_dispatcher.rb +179 -0
  82. data/lib/rex/logging/log_sink.rb +42 -0
  83. data/lib/rex/logging/sinks/flatfile.rb +55 -0
  84. data/lib/rex/logging/sinks/stderr.rb +43 -0
  85. data/lib/rex/machparsey.rb +9 -0
  86. data/lib/rex/machparsey/exceptions.rb +34 -0
  87. data/lib/rex/machparsey/mach.rb +209 -0
  88. data/lib/rex/machparsey/machbase.rb +408 -0
  89. data/lib/rex/machscan.rb +9 -0
  90. data/lib/rex/machscan/scanner.rb +217 -0
  91. data/lib/rex/mime.rb +9 -0
  92. data/lib/rex/mime/header.rb +75 -0
  93. data/lib/rex/mime/message.rb +112 -0
  94. data/lib/rex/mime/part.rb +20 -0
  95. data/lib/rex/nop/opty2.rb +108 -0
  96. data/lib/rex/nop/opty2.rb.ut.rb +23 -0
  97. data/lib/rex/nop/opty2_tables.rb +300 -0
  98. data/lib/rex/ole.rb +128 -0
  99. data/lib/rex/ole/clsid.rb +47 -0
  100. data/lib/rex/ole/difat.rb +141 -0
  101. data/lib/rex/ole/directory.rb +230 -0
  102. data/lib/rex/ole/direntry.rb +240 -0
  103. data/lib/rex/ole/fat.rb +99 -0
  104. data/lib/rex/ole/header.rb +204 -0
  105. data/lib/rex/ole/minifat.rb +77 -0
  106. data/lib/rex/ole/samples/create_ole.rb +27 -0
  107. data/lib/rex/ole/samples/dir.rb +35 -0
  108. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  109. data/lib/rex/ole/samples/ole_info.rb +23 -0
  110. data/lib/rex/ole/storage.rb +395 -0
  111. data/lib/rex/ole/stream.rb +53 -0
  112. data/lib/rex/ole/substorage.rb +49 -0
  113. data/lib/rex/ole/util.rb +157 -0
  114. data/lib/rex/parser/arguments.rb +97 -0
  115. data/lib/rex/parser/arguments.rb.ut.rb +67 -0
  116. data/lib/rex/parser/ini.rb +185 -0
  117. data/lib/rex/parser/ini.rb.ut.rb +29 -0
  118. data/lib/rex/parser/nmap_xml.rb +111 -0
  119. data/lib/rex/payloads.rb +1 -0
  120. data/lib/rex/payloads/win32.rb +2 -0
  121. data/lib/rex/payloads/win32/common.rb +26 -0
  122. data/lib/rex/payloads/win32/kernel.rb +53 -0
  123. data/lib/rex/payloads/win32/kernel/common.rb +54 -0
  124. data/lib/rex/payloads/win32/kernel/migration.rb +12 -0
  125. data/lib/rex/payloads/win32/kernel/recovery.rb +50 -0
  126. data/lib/rex/payloads/win32/kernel/stager.rb +171 -0
  127. data/lib/rex/peparsey.rb +12 -0
  128. data/lib/rex/peparsey/exceptions.rb +32 -0
  129. data/lib/rex/peparsey/pe.rb +188 -0
  130. data/lib/rex/peparsey/pe_memdump.rb +63 -0
  131. data/lib/rex/peparsey/pebase.rb +1655 -0
  132. data/lib/rex/peparsey/section.rb +136 -0
  133. data/lib/rex/pescan.rb +13 -0
  134. data/lib/rex/pescan/analyze.rb +309 -0
  135. data/lib/rex/pescan/scanner.rb +206 -0
  136. data/lib/rex/pescan/search.rb +56 -0
  137. data/lib/rex/platforms.rb +1 -0
  138. data/lib/rex/platforms/windows.rb +51 -0
  139. data/lib/rex/poly.rb +132 -0
  140. data/lib/rex/poly/block.rb +468 -0
  141. data/lib/rex/poly/register.rb +100 -0
  142. data/lib/rex/poly/register/x86.rb +40 -0
  143. data/lib/rex/post.rb +8 -0
  144. data/lib/rex/post/dir.rb +51 -0
  145. data/lib/rex/post/file.rb +172 -0
  146. data/lib/rex/post/file_stat.rb +220 -0
  147. data/lib/rex/post/gen.pl +13 -0
  148. data/lib/rex/post/io.rb +182 -0
  149. data/lib/rex/post/meterpreter.rb +4 -0
  150. data/lib/rex/post/meterpreter/channel.rb +438 -0
  151. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  152. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  153. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  154. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  155. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  156. data/lib/rex/post/meterpreter/client.rb +335 -0
  157. data/lib/rex/post/meterpreter/client_core.rb +274 -0
  158. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  159. data/lib/rex/post/meterpreter/extension.rb +32 -0
  160. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  161. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +16 -0
  162. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  163. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +21 -0
  164. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  165. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  166. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +104 -0
  167. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +28 -0
  168. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +100 -0
  169. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +24 -0
  170. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +333 -0
  171. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +273 -0
  172. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +235 -0
  173. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +103 -0
  174. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  175. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +144 -0
  176. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +73 -0
  177. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +56 -0
  178. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +137 -0
  179. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +167 -0
  180. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +167 -0
  181. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +192 -0
  182. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +139 -0
  183. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +97 -0
  184. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +184 -0
  185. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  186. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +61 -0
  187. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  189. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  190. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  191. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  192. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +279 -0
  193. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +182 -0
  194. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  195. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +174 -0
  196. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +185 -0
  197. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +227 -0
  198. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  199. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  200. data/lib/rex/post/meterpreter/packet.rb +596 -0
  201. data/lib/rex/post/meterpreter/packet_dispatcher.rb +409 -0
  202. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  203. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  204. data/lib/rex/post/meterpreter/ui/console.rb +135 -0
  205. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +62 -0
  206. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +595 -0
  207. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +108 -0
  208. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +241 -0
  209. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +61 -0
  210. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +98 -0
  211. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +51 -0
  212. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +132 -0
  213. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +187 -0
  214. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +63 -0
  215. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +376 -0
  216. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +270 -0
  217. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +484 -0
  218. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +315 -0
  219. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +95 -0
  220. data/lib/rex/post/permission.rb +26 -0
  221. data/lib/rex/post/process.rb +57 -0
  222. data/lib/rex/post/thread.rb +57 -0
  223. data/lib/rex/post/ui.rb +52 -0
  224. data/lib/rex/proto.rb +12 -0
  225. data/lib/rex/proto.rb.ts.rb +8 -0
  226. data/lib/rex/proto/dcerpc.rb +6 -0
  227. data/lib/rex/proto/dcerpc.rb.ts.rb +9 -0
  228. data/lib/rex/proto/dcerpc/client.rb +358 -0
  229. data/lib/rex/proto/dcerpc/client.rb.ut.rb +491 -0
  230. data/lib/rex/proto/dcerpc/exceptions.rb +150 -0
  231. data/lib/rex/proto/dcerpc/handle.rb +47 -0
  232. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +85 -0
  233. data/lib/rex/proto/dcerpc/ndr.rb +72 -0
  234. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +41 -0
  235. data/lib/rex/proto/dcerpc/packet.rb +253 -0
  236. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +56 -0
  237. data/lib/rex/proto/dcerpc/response.rb +186 -0
  238. data/lib/rex/proto/dcerpc/response.rb.ut.rb +15 -0
  239. data/lib/rex/proto/dcerpc/uuid.rb +84 -0
  240. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +46 -0
  241. data/lib/rex/proto/drda.rb +5 -0
  242. data/lib/rex/proto/drda.rb.ts.rb +17 -0
  243. data/lib/rex/proto/drda/constants.rb +49 -0
  244. data/lib/rex/proto/drda/constants.rb.ut.rb +23 -0
  245. data/lib/rex/proto/drda/packet.rb +252 -0
  246. data/lib/rex/proto/drda/packet.rb.ut.rb +109 -0
  247. data/lib/rex/proto/drda/utils.rb +123 -0
  248. data/lib/rex/proto/drda/utils.rb.ut.rb +84 -0
  249. data/lib/rex/proto/http.rb +5 -0
  250. data/lib/rex/proto/http.rb.ts.rb +12 -0
  251. data/lib/rex/proto/http/client.rb +817 -0
  252. data/lib/rex/proto/http/client.rb.ut.rb +93 -0
  253. data/lib/rex/proto/http/handler.rb +46 -0
  254. data/lib/rex/proto/http/handler/erb.rb +128 -0
  255. data/lib/rex/proto/http/handler/erb.rb.ut.rb +21 -0
  256. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +1 -0
  257. data/lib/rex/proto/http/handler/proc.rb +54 -0
  258. data/lib/rex/proto/http/handler/proc.rb.ut.rb +24 -0
  259. data/lib/rex/proto/http/header.rb +161 -0
  260. data/lib/rex/proto/http/header.rb.ut.rb +46 -0
  261. data/lib/rex/proto/http/packet.rb +394 -0
  262. data/lib/rex/proto/http/packet.rb.ut.rb +165 -0
  263. data/lib/rex/proto/http/request.rb +356 -0
  264. data/lib/rex/proto/http/request.rb.ut.rb +214 -0
  265. data/lib/rex/proto/http/response.rb +85 -0
  266. data/lib/rex/proto/http/response.rb.ut.rb +149 -0
  267. data/lib/rex/proto/http/server.rb +367 -0
  268. data/lib/rex/proto/http/server.rb.ut.rb +79 -0
  269. data/lib/rex/proto/smb.rb +7 -0
  270. data/lib/rex/proto/smb.rb.ts.rb +8 -0
  271. data/lib/rex/proto/smb/client.rb +1733 -0
  272. data/lib/rex/proto/smb/client.rb.ut.rb +223 -0
  273. data/lib/rex/proto/smb/constants.rb +1062 -0
  274. data/lib/rex/proto/smb/constants.rb.ut.rb +18 -0
  275. data/lib/rex/proto/smb/crypt.rb +95 -0
  276. data/lib/rex/proto/smb/crypt.rb.ut.rb +20 -0
  277. data/lib/rex/proto/smb/evasions.rb +65 -0
  278. data/lib/rex/proto/smb/exceptions.rb +846 -0
  279. data/lib/rex/proto/smb/simpleclient.rb +292 -0
  280. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +128 -0
  281. data/lib/rex/proto/smb/utils.rb +514 -0
  282. data/lib/rex/proto/smb/utils.rb.ut.rb +20 -0
  283. data/lib/rex/proto/sunrpc.rb +1 -0
  284. data/lib/rex/proto/sunrpc/client.rb +195 -0
  285. data/lib/rex/script.rb +42 -0
  286. data/lib/rex/script/base.rb +59 -0
  287. data/lib/rex/script/meterpreter.rb +9 -0
  288. data/lib/rex/script/shell.rb +9 -0
  289. data/lib/rex/service.rb +48 -0
  290. data/lib/rex/service_manager.rb +141 -0
  291. data/lib/rex/service_manager.rb.ut.rb +32 -0
  292. data/lib/rex/services/local_relay.rb +423 -0
  293. data/lib/rex/socket.rb +586 -0
  294. data/lib/rex/socket.rb.ut.rb +86 -0
  295. data/lib/rex/socket/comm.rb +119 -0
  296. data/lib/rex/socket/comm/local.rb +409 -0
  297. data/lib/rex/socket/comm/local.rb.ut.rb +75 -0
  298. data/lib/rex/socket/ip.rb +129 -0
  299. data/lib/rex/socket/parameters.rb +345 -0
  300. data/lib/rex/socket/parameters.rb.ut.rb +51 -0
  301. data/lib/rex/socket/range_walker.rb +295 -0
  302. data/lib/rex/socket/range_walker.rb.ut.rb +55 -0
  303. data/lib/rex/socket/ssl_tcp.rb +184 -0
  304. data/lib/rex/socket/ssl_tcp.rb.ut.rb +39 -0
  305. data/lib/rex/socket/ssl_tcp_server.rb +122 -0
  306. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +51 -0
  307. data/lib/rex/socket/subnet_walker.rb +75 -0
  308. data/lib/rex/socket/subnet_walker.rb.ut.rb +28 -0
  309. data/lib/rex/socket/switch_board.rb +272 -0
  310. data/lib/rex/socket/switch_board.rb.ut.rb +52 -0
  311. data/lib/rex/socket/tcp.rb +76 -0
  312. data/lib/rex/socket/tcp.rb.ut.rb +64 -0
  313. data/lib/rex/socket/tcp_server.rb +67 -0
  314. data/lib/rex/socket/tcp_server.rb.ut.rb +44 -0
  315. data/lib/rex/socket/udp.rb +157 -0
  316. data/lib/rex/socket/udp.rb.ut.rb +44 -0
  317. data/lib/rex/struct2.rb +5 -0
  318. data/lib/rex/struct2/c_struct.rb +181 -0
  319. data/lib/rex/struct2/c_struct_template.rb +39 -0
  320. data/lib/rex/struct2/constant.rb +26 -0
  321. data/lib/rex/struct2/element.rb +44 -0
  322. data/lib/rex/struct2/generic.rb +73 -0
  323. data/lib/rex/struct2/restraint.rb +54 -0
  324. data/lib/rex/struct2/s_string.rb +72 -0
  325. data/lib/rex/struct2/s_struct.rb +111 -0
  326. data/lib/rex/sync.rb +6 -0
  327. data/lib/rex/sync/event.rb +94 -0
  328. data/lib/rex/sync/read_write_lock.rb +176 -0
  329. data/lib/rex/sync/ref.rb +57 -0
  330. data/lib/rex/sync/thread_safe.rb +82 -0
  331. data/lib/rex/test.rb +35 -0
  332. data/lib/rex/text.rb +1029 -0
  333. data/lib/rex/text.rb.ut.rb +168 -0
  334. data/lib/rex/time.rb +65 -0
  335. data/lib/rex/transformer.rb +115 -0
  336. data/lib/rex/transformer.rb.ut.rb +38 -0
  337. data/lib/rex/ui.rb +21 -0
  338. data/lib/rex/ui/interactive.rb +252 -0
  339. data/lib/rex/ui/output.rb +80 -0
  340. data/lib/rex/ui/output/none.rb +18 -0
  341. data/lib/rex/ui/progress_tracker.rb +96 -0
  342. data/lib/rex/ui/subscriber.rb +149 -0
  343. data/lib/rex/ui/text/color.rb +97 -0
  344. data/lib/rex/ui/text/color.rb.ut.rb +18 -0
  345. data/lib/rex/ui/text/dispatcher_shell.rb +382 -0
  346. data/lib/rex/ui/text/input.rb +117 -0
  347. data/lib/rex/ui/text/input/buffer.rb +75 -0
  348. data/lib/rex/ui/text/input/readline.rb +129 -0
  349. data/lib/rex/ui/text/input/socket.rb +95 -0
  350. data/lib/rex/ui/text/input/stdio.rb +45 -0
  351. data/lib/rex/ui/text/irb_shell.rb +55 -0
  352. data/lib/rex/ui/text/output.rb +80 -0
  353. data/lib/rex/ui/text/output/buffer.rb +65 -0
  354. data/lib/rex/ui/text/output/file.rb +37 -0
  355. data/lib/rex/ui/text/output/socket.rb +43 -0
  356. data/lib/rex/ui/text/output/stdio.rb +40 -0
  357. data/lib/rex/ui/text/progress_tracker.rb +56 -0
  358. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +34 -0
  359. data/lib/rex/ui/text/shell.rb +321 -0
  360. data/lib/rex/ui/text/table.rb +254 -0
  361. data/lib/rex/ui/text/table.rb.ut.rb +55 -0
  362. data/lib/rex/zip.rb +93 -0
  363. data/lib/rex/zip/archive.rb +91 -0
  364. data/lib/rex/zip/blocks.rb +182 -0
  365. data/lib/rex/zip/entry.rb +95 -0
  366. data/lib/rex/zip/samples/comment.rb +32 -0
  367. data/lib/rex/zip/samples/mkwar.rb +138 -0
  368. data/lib/rex/zip/samples/mkzip.rb +19 -0
  369. data/lib/rex/zip/samples/recursive.rb +58 -0
  370. metadata +435 -0
@@ -0,0 +1,468 @@
1
+ module Rex
2
+ module Poly
3
+
4
+ ###
5
+ #
6
+ # This class encapsulates a LogicalBlock permutation. Block permutations can
7
+ # take the form of a static string or a procedure. This makes it possible to
8
+ # have simple blocks and more complicated ones that take into account other
9
+ # variables, such as dynamic registers. The to_s method will return the
10
+ # string version of the permutation, regardless of whether or not the
11
+ # underlying permutation is a string or a procedure.
12
+ #
13
+ ###
14
+ class Permutation
15
+
16
+ #
17
+ # Initializes the permutation and its associated block.
18
+ #
19
+ def initialize(perm, block)
20
+ @perm = perm
21
+ @block = block
22
+ end
23
+
24
+ #
25
+ # Returns the length of the string returned by to_s.
26
+ #
27
+ def length
28
+ to_s.length
29
+ end
30
+
31
+ #
32
+ # Returns the string representation of the permutation. If the underlying
33
+ # permutation is a procedure, the procedure is called. Otherwise, the
34
+ # string representation of the permutation is returned.
35
+ #
36
+ def to_s
37
+ if (@perm.kind_of?(Proc))
38
+ @perm.call(@block).to_s
39
+ else
40
+ @perm.to_s
41
+ end
42
+ end
43
+
44
+ attr_reader :perm
45
+
46
+ end
47
+
48
+ ###
49
+ #
50
+ # This class represents a logical block which is defined as a concise portion
51
+ # of code that may have one or more functionally equivalent implementations.
52
+ # A logical block should serve a very specific purpose, and any permutations
53
+ # beyond the first should result in exactly the same functionality without any
54
+ # adverse side effects to other blocks.
55
+ #
56
+ # Like blocks of code, LogicalBlock's can depend on one another in terms of
57
+ # ordering and precedence. By marking blocks as dependent on another, a
58
+ # hierarchy begins to form. This is a block dependency graph.
59
+ #
60
+ # To add permutations to a LogicalBlock, they can either be passed in as a
61
+ # list of arguments to the constructor following the blocks name or can be
62
+ # added on the fly by calling the add_perm method. To get a random
63
+ # permutation, the rand_perm method can be called.
64
+ #
65
+ # To mark one block as depending on another, the depends_on method can be
66
+ # called with zero or more LogicalBlock instances as parameters.
67
+ #
68
+ ###
69
+ class LogicalBlock
70
+
71
+ #
72
+ # Initializes the logical block's name along with zero or more specific
73
+ # blocks.
74
+ #
75
+ def initialize(name, *perms)
76
+ @name = name
77
+
78
+ reset
79
+
80
+ add_perm(*perms)
81
+ end
82
+
83
+ #
84
+ # Resets the block back to its starting point.
85
+ #
86
+ def reset
87
+ @perms = []
88
+ @depends = []
89
+ @next_blocks = []
90
+ @clobbers = []
91
+ @offset = nil
92
+ @state = nil
93
+ @once = false
94
+ @references = 0
95
+ @used_references = 0
96
+ @generated = false
97
+ end
98
+
99
+ #
100
+ # Returns the block's name.
101
+ #
102
+ def name
103
+ @name
104
+ end
105
+
106
+ #
107
+ # Flags whether or not the block should only be generated once. This can
108
+ # be used to mark a blog as being depended upon by multiple blocks, but
109
+ # making it such that it is only generated once.
110
+ #
111
+ def once=(tf)
112
+ @once = tf
113
+ end
114
+
115
+ #
116
+ # Returns true if this block is a 'once' block. That is, this block is
117
+ # dependend upon by multiple blocks but should only be generated once.
118
+ #
119
+ def once
120
+ @once
121
+ end
122
+
123
+ #
124
+ # Increments the number of blocks that depend on this block.
125
+ #
126
+ def ref
127
+ @references += 1
128
+ end
129
+
130
+ #
131
+ # Increments the number of blocks that have completed their dependency
132
+ # pass on this block. This number should never become higher than the
133
+ # @references attribute.
134
+ #
135
+ def deref
136
+ @used_references += 1
137
+ end
138
+
139
+ #
140
+ # Returns true if there is only one block reference remaining.
141
+ #
142
+ def last_reference?
143
+ (@references - @used_references <= 0)
144
+ end
145
+
146
+ #
147
+ # Adds zero or more specific permutations that may be represented either as
148
+ # strings or as Proc's to be called at evaluation time.
149
+ #
150
+ def add_perm(*perms)
151
+ @perms.concat(perms)
152
+ end
153
+
154
+ #
155
+ # Returns a random permutation that is encapsulated in a Permutation class
156
+ # instance.
157
+ #
158
+ def rand_perm
159
+ perm = nil
160
+
161
+ if (@state.badchars)
162
+ perm = rand_perm_badchars
163
+ else
164
+ perm = Permutation.new(@perms[rand(@perms.length)], self)
165
+ end
166
+
167
+ if (perm.nil?)
168
+ raise RuntimeError, "Failed to locate a valid permutation."
169
+ end
170
+
171
+ perm
172
+ end
173
+
174
+ #
175
+ # Returns a random permutation that passes any necessary bad character
176
+ # checks.
177
+ #
178
+ def rand_perm_badchars
179
+ idx = rand(@perms.length)
180
+ off = 0
181
+
182
+ while (off < @perms.length)
183
+ p = @perms[(idx + off) % @perms.length]
184
+
185
+ if (p.kind_of?(Proc) or
186
+ @state.badchars.nil? or
187
+ Rex::Text.badchar_index(p, @state.badchars).nil?)
188
+ return Permutation.new(p, self)
189
+ end
190
+
191
+ off += 1
192
+ end
193
+ end
194
+
195
+ #
196
+ # Sets the blocks that this block instance depends on.
197
+ #
198
+ def depends_on(*depends)
199
+ @depends = depends.dup
200
+
201
+ # Increment dependent references
202
+ @depends.each { |b| b.ref }
203
+ end
204
+
205
+ #
206
+ # Defines the next blocks, but not in a dependency fashion but rather in a
207
+ # linking of separate block contexts.
208
+ #
209
+ def next_blocks(*blocks)
210
+ @next_blocks = blocks.dup
211
+ end
212
+
213
+ #
214
+ # Defines the list of zero or more LogicalRegister's that this block
215
+ # clobbers.
216
+ #
217
+ def clobbers(*registers)
218
+ @clobbers = registers
219
+ end
220
+
221
+ #
222
+ # Enumerates each register instance that is clobbered by this block.
223
+ #
224
+ def each_clobbers(&block)
225
+ @clobbers.each(&block)
226
+ end
227
+
228
+ #
229
+ # Generates the polymorphic buffer that results from this block and any of
230
+ # the blocks that it either directly or indirectly depends on. A list of
231
+ # register numbers to be saved can be passed in as an argument.
232
+ #
233
+ # This method is not thread safe. To call this method on a single block
234
+ # instance from within multiple threads, be sure to encapsulate the calls
235
+ # inside a locked context.
236
+ #
237
+ def generate(save_registers = nil, state = nil, badchars = nil)
238
+ # Create a localized state instance if one was not supplied.
239
+ state = Rex::Poly::State.new if (state == nil)
240
+ buf = nil
241
+ cnt = 0
242
+
243
+ # This is a lame way of doing this. We just try to generate at most 128
244
+ # times until we don't have badchars. The reason we have to do it this
245
+ # way is because of the fact that badchars can be introduced through
246
+ # block offsetting and register number selection which can't be readily
247
+ # predicted or detected during the generation phase. In the future we
248
+ # can make this better, but for now this will have to do.
249
+ begin
250
+ buf = do_generate(save_registers, state, badchars)
251
+
252
+ if (buf and
253
+ (badchars.nil? or Rex::Text.badchar_index(buf, badchars).nil?))
254
+ break
255
+ end
256
+ end while ((cnt += 1) < 128)
257
+
258
+ # If we passed 128 tries, then we can't succeed.
259
+ buf = nil if (cnt >= 128)
260
+
261
+ buf
262
+ end
263
+
264
+ #
265
+ # Returns the offset of a block. If the active state for this instance is
266
+ # operating in the first phase, then zero is always returned. Otherwise,
267
+ # the correct offset for the supplied block is returned.
268
+ #
269
+ def offset_of(lblock)
270
+ if (@state.first_phase)
271
+ 0
272
+ else
273
+ if (lblock.kind_of?(SymbolicBlock::End))
274
+ @state.curr_offset
275
+ else
276
+ lblock.offset
277
+ end
278
+ end
279
+ end
280
+
281
+ #
282
+ # Returns the register number associated with the supplied LogicalRegister
283
+ # instance. If the active state for this instance is operating in the
284
+ # first phase, then zero is always returned. Otherwise, the correct
285
+ # register number is returned based on what is currently assigned to the
286
+ # supplied LogicalRegister instance, if anything.
287
+ #
288
+ def regnum_of(reg)
289
+ (@state.first_phase) ? 0 : reg.regnum
290
+ end
291
+
292
+ #
293
+ # This attributes contains the currently assigned offset of the permutation
294
+ # associated with this block into the polymorphic buffer that is being
295
+ # generated.
296
+ #
297
+ attr_accessor :offset
298
+
299
+ #
300
+ # Whether or not this block has currently been generated for a given
301
+ # iteration.
302
+ #
303
+ attr_accessor :generated
304
+
305
+ protected
306
+
307
+ #
308
+ # Performs the actual polymorphic buffer generation. Called from generate
309
+ #
310
+ def do_generate(save_registers, state, badchars)
311
+ # Reset the state in case it was passed in.
312
+ state.reset
313
+
314
+ # Set the bad character list
315
+ state.badchars = badchars if (badchars)
316
+
317
+ # Consume any registers that should be saved.
318
+ save_registers.each { |reg|
319
+ state.consume_regnum(reg)
320
+ } if (save_registers)
321
+
322
+ # Build the linear list of blocks that will be processed. This
323
+ # list is built in a dynamic fashion based on block dependencies.
324
+ # The list that is returned is an Array of which each element is a two
325
+ # member array, the first element being the LogicalBlock instance that
326
+ # the permutation came from and the second being an instance of the
327
+ # Permutation class associated with the selected permutation.
328
+ block_list = generate_block_list(state)
329
+
330
+ # Transition into the second phase which enables offset_of and regnum_of
331
+ # calls to return real values.
332
+ state.first_phase = false
333
+
334
+ # Now that every block has been assigned an offset, generate the
335
+ # buffer block by block, assigning registers as necessary.
336
+ block_list.each { |b|
337
+
338
+ # Generate the next permutation and append it to the buffer.
339
+ begin
340
+ state.buffer += b[1].to_s
341
+ # If an invalid register exception is raised, try to consume a random
342
+ # register from the register's associated architecture register
343
+ # number set.
344
+ rescue InvalidRegisterError => e
345
+ e.reg.regnum = state.consume_regnum_from_set(e.reg.class.regnum_set)
346
+ retry
347
+ end
348
+
349
+ # Remove any of the registers that have been clobbered by this block
350
+ # from the list of consumed register numbers so that they can be used
351
+ # in the future.
352
+ b[0].each_clobbers { |reg|
353
+ begin
354
+ state.defecate_regnum(reg.regnum)
355
+
356
+ reg.regnum = nil
357
+ rescue InvalidRegisterError
358
+ end
359
+ }
360
+
361
+ }
362
+
363
+ # Finally, return the buffer that has been created.
364
+ state.buffer
365
+ end
366
+
367
+ #
368
+ # Generates the linear list of block permutations which is stored in the
369
+ # supplied state instance. This is done prior to assigning blocks offsets
370
+ #
371
+ def generate_block_list(state, level=0)
372
+ if @depends.length > 1
373
+ @depends.length.times {
374
+ f = rand(@depends.length)
375
+ @depends.push(@depends.delete_at(f))
376
+ }
377
+ end
378
+
379
+ @depends.length.times { |cidx|
380
+
381
+ pass = false
382
+
383
+ while (not pass)
384
+
385
+ if (@depends[cidx].generated)
386
+ break
387
+
388
+ # If this dependent block is a once block and the magic 8 ball turns
389
+ # up zero, skip it and let a later block pick it up. We only do this
390
+ # if we are not the last block to have a dependency on this block.
391
+ elsif ((@depends[cidx].once) and
392
+ (rand(2).to_i == 0) and
393
+ (@depends[cidx].last_reference? == false))
394
+ break
395
+ end
396
+
397
+ # Generate this block
398
+ @depends[cidx].generate_block_list(state, level+1)
399
+
400
+ if level != 0
401
+ return
402
+ else
403
+ @depends.length.times {
404
+ f = rand(@depends.length)
405
+ @depends.push(@depends.delete_at(f))
406
+ }
407
+
408
+ next
409
+ end
410
+ end
411
+
412
+ next
413
+ }
414
+
415
+ self.deref
416
+
417
+ # Assign the instance local state for the duration of this generation
418
+ @state = state
419
+
420
+ # Select a random permutation
421
+ perm = rand_perm
422
+
423
+ # Set our block offset to the current state offset
424
+ self.offset = state.curr_offset
425
+
426
+ # Flag ourselves as having been generated for this iteration.
427
+ self.generated = true
428
+
429
+ # Adjust the current offset based on the permutations length
430
+ state.curr_offset += perm.length
431
+
432
+ # Add it to the linear list of blocks
433
+ state.block_list << [ self, perm ]
434
+
435
+ # Generate all the blocks that follow this one.
436
+ @next_blocks.each { |b|
437
+ b.generate_block_list(state)
438
+ }
439
+
440
+ # Return the state's block list
441
+ state.block_list
442
+ end
443
+
444
+ end
445
+
446
+ ###
447
+ #
448
+ # Symbolic blocks are used as special-case LogicalBlock's that have meaning
449
+ # a more general meaning. For instance, SymbolicBlock::End can be used to
450
+ # symbolize the end of a polymorphic buffer.
451
+ #
452
+ ###
453
+ module SymbolicBlock
454
+
455
+ ###
456
+ #
457
+ # The symbolic end of a polymorphic buffer.
458
+ #
459
+ ###
460
+ class End < LogicalBlock
461
+ def initialize
462
+ super('__SYMBLK_END__')
463
+ end
464
+ end
465
+ end
466
+
467
+ end
468
+ end