dstruct 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 (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,124 @@
1
+ # -*- coding: binary -*-
2
+ #
3
+ # Log severities
4
+ #
5
+ LOG_ERROR = 'error'
6
+ LOG_DEBUG = 'debug'
7
+ LOG_INFO = 'info'
8
+ LOG_WARN = 'warn'
9
+ LOG_RAW = 'raw'
10
+
11
+ ##
12
+ #
13
+ # Log levels
14
+ #
15
+ ##
16
+
17
+ #
18
+ # LEV_0 - Default
19
+ #
20
+ # This log level is the default log level if none is specified. It should be
21
+ # used when a log message should always be displayed when logging is enabled.
22
+ # Very few log messages should occur at this level aside from necessary
23
+ # information logging and error/warning logging. Debug logging at level zero
24
+ # is not advised.
25
+ #
26
+ LEV_0 = 0
27
+
28
+ #
29
+ # LEV_1 - Extra
30
+ #
31
+ # This log level should be used when extra information may be needed to
32
+ # understand the cause of an error or warning message or to get debugging
33
+ # information that might give clues as to why something is happening. This
34
+ # log level should be used only when information may be useful to understanding
35
+ # the behavior of something at a basic level. This log level should not be
36
+ # used in an exhaustively verbose fashion.
37
+ #
38
+ LEV_1 = 1
39
+
40
+ #
41
+ # LEV_2 - Verbose
42
+ #
43
+ # This log level should be used when verbose information may be needed to
44
+ # analyze the behavior of the framework. This should be the default log
45
+ # level for all detailed information not falling into LEV_0 or LEV_1.
46
+ # It is recommended that this log level be used by default if you are
47
+ # unsure.
48
+ #
49
+ LEV_2 = 2
50
+
51
+ #
52
+ # LEV_3 - Insanity
53
+ #
54
+ # This log level should contain very verbose information about the
55
+ # behavior of the framework, such as detailed information about variable
56
+ # states at certain phases including, but not limited to, loop iterations,
57
+ # function calls, and so on. This log level will rarely be displayed,
58
+ # but when it is the information provided should make it easy to analyze
59
+ # any problem.
60
+ #
61
+ LEV_3 = 3
62
+
63
+
64
+ #
65
+ # Architecture constants
66
+ #
67
+ ARCH_ANY = '_any_'
68
+ ARCH_X86 = 'x86'
69
+ ARCH_X86_64 = 'x86_64'
70
+ ARCH_X64 = 'x64' # To be used for compatability with ARCH_X86_64
71
+ ARCH_MIPS = 'mips'
72
+ ARCH_MIPSLE = 'mipsle'
73
+ ARCH_MIPSBE = 'mipsbe'
74
+ ARCH_PPC = 'ppc'
75
+ ARCH_PPC64 = 'ppc64'
76
+ ARCH_CBEA = 'cbea'
77
+ ARCH_CBEA64 = 'cbea64'
78
+ ARCH_SPARC = 'sparc'
79
+ ARCH_CMD = 'cmd'
80
+ ARCH_PHP = 'php'
81
+ ARCH_TTY = 'tty'
82
+ ARCH_ARMLE = 'armle'
83
+ ARCH_ARMBE = 'armbe'
84
+ ARCH_JAVA = 'java'
85
+ ARCH_RUBY = 'ruby'
86
+ ARCH_DALVIK = 'dalvik'
87
+ ARCH_PYTHON = 'python'
88
+ ARCH_NODEJS = 'nodejs'
89
+ ARCH_FIREFOX = 'firefox'
90
+ ARCH_TYPES =
91
+ [
92
+ ARCH_X86,
93
+ ARCH_X86_64,
94
+ ARCH_MIPS,
95
+ ARCH_MIPSLE,
96
+ ARCH_MIPSBE,
97
+ ARCH_PPC,
98
+ ARCH_PPC64,
99
+ ARCH_CBEA,
100
+ ARCH_CBEA64,
101
+ ARCH_SPARC,
102
+ ARCH_ARMLE,
103
+ ARCH_ARMBE,
104
+ ARCH_CMD,
105
+ ARCH_PHP,
106
+ ARCH_TTY,
107
+ ARCH_JAVA,
108
+ ARCH_RUBY,
109
+ ARCH_DALVIK,
110
+ ARCH_PYTHON,
111
+ ARCH_NODEJS,
112
+ ARCH_FIREFOX
113
+ ]
114
+
115
+ ARCH_ALL = ARCH_TYPES
116
+
117
+ #
118
+ # Endian constants
119
+ #
120
+ ENDIAN_LITTLE = 0
121
+ ENDIAN_BIG = 1
122
+
123
+ IS_ENDIAN_LITTLE = ( [1].pack('s') == "\x01\x00" ) ? true : false
124
+ IS_ENDIAN_BIG = ( not IS_ENDIAN_LITTLE )
@@ -0,0 +1,9 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module ElfParsey
5
+
6
+ end
7
+ end
8
+
9
+ require 'rex/elfparsey/elf'
@@ -0,0 +1,121 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/elfparsey/elfbase'
4
+ require 'rex/elfparsey/exceptions'
5
+ require 'rex/image_source'
6
+
7
+ module Rex
8
+ module ElfParsey
9
+ class Elf < ElfBase
10
+
11
+ attr_accessor :elf_header, :program_header, :base_addr, :isource
12
+
13
+ def initialize(isource)
14
+ offset = 0
15
+ base_addr = 0
16
+
17
+ # ELF Header
18
+ elf_header = ElfHeader.new(isource.read(offset, ELF_HEADER_SIZE))
19
+
20
+ # Data encoding
21
+ ei_data = elf_header.e_ident[EI_DATA,1].unpack("C")[0]
22
+
23
+ e_phoff = elf_header.e_phoff
24
+ e_phentsize = elf_header.e_phentsize
25
+ e_phnum = elf_header.e_phnum
26
+
27
+ # Program Header Table
28
+ program_header = []
29
+
30
+ e_phnum.times do |i|
31
+ offset = e_phoff + (e_phentsize * i)
32
+
33
+ program_header << ProgramHeader.new(
34
+ isource.read(offset, PROGRAM_HEADER_SIZE), ei_data
35
+ )
36
+
37
+ if program_header[-1].p_type == PT_LOAD && base_addr == 0
38
+ base_addr = program_header[-1].p_vaddr
39
+ end
40
+
41
+ end
42
+
43
+ self.elf_header = elf_header
44
+ self.program_header = program_header
45
+ self.base_addr = base_addr
46
+ self.isource = isource
47
+ end
48
+
49
+ def self.new_from_file(filename, disk_backed = false)
50
+
51
+ file = ::File.new(filename)
52
+ # file.binmode # windows... :\
53
+
54
+ if disk_backed
55
+ return self.new(ImageSource::Disk.new(file))
56
+ else
57
+ obj = new_from_string(file.read)
58
+ file.close
59
+ return obj
60
+ end
61
+ end
62
+
63
+ def self.new_from_string(data)
64
+ return self.new(ImageSource::Memory.new(data))
65
+ end
66
+
67
+ #
68
+ # Returns true if this binary is for a 64-bit architecture.
69
+ #
70
+ def ptr_64?
71
+ unless [ ELFCLASS32, ELFCLASS64 ].include?(
72
+ elf_header.e_ident[EI_CLASS,1].unpack("C*")[0])
73
+ raise ElfHeaderError, 'Invalid class', caller
74
+ end
75
+
76
+ elf_header.e_ident[EI_CLASS,1].unpack("C*")[0] == ELFCLASS64
77
+ end
78
+
79
+ #
80
+ # Returns true if this binary is for a 32-bit architecture.
81
+ # This check does not take into account 16-bit binaries at the moment.
82
+ #
83
+ def ptr_32?
84
+ ptr_64? == false
85
+ end
86
+
87
+ #
88
+ # Converts a virtual address to a string representation based on the
89
+ # underlying architecture.
90
+ #
91
+ def ptr_s(rva)
92
+ (ptr_32?) ? ("0x%.8x" % rva) : ("0x%.16x" % rva)
93
+ end
94
+
95
+ def offset_to_rva(offset)
96
+ base_addr + offset
97
+ end
98
+
99
+ def rva_to_offset(rva)
100
+ rva - base_addr
101
+ end
102
+
103
+ def read(offset, len)
104
+ isource.read(offset, len)
105
+ end
106
+
107
+ def read_rva(rva, len)
108
+ isource.read(rva_to_offset(rva), len)
109
+ end
110
+
111
+ def index(*args)
112
+ isource.index(*args)
113
+ end
114
+
115
+ def close
116
+ isource.close
117
+ end
118
+
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,256 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/struct2'
4
+
5
+ module Rex
6
+ module ElfParsey
7
+ class ElfBase
8
+
9
+ # ELF Header
10
+
11
+ ELF_HEADER_SIZE = 52
12
+
13
+ EI_NIDENT = 16
14
+
15
+ ELF32_EHDR_LSB = Rex::Struct2::CStructTemplate.new(
16
+ [ 'string', 'e_ident', EI_NIDENT, '' ],
17
+ [ 'uint16v', 'e_type', 0 ],
18
+ [ 'uint16v', 'e_machine', 0 ],
19
+ [ 'uint32v', 'e_version', 0 ],
20
+ [ 'uint32v', 'e_entry', 0 ],
21
+ [ 'uint32v', 'e_phoff', 0 ],
22
+ [ 'uint32v', 'e_shoff', 0 ],
23
+ [ 'uint32v', 'e_flags', 0 ],
24
+ [ 'uint16v', 'e_ehsize', 0 ],
25
+ [ 'uint16v', 'e_phentsize', 0 ],
26
+ [ 'uint16v', 'e_phnum', 0 ],
27
+ [ 'uint16v', 'e_shentsize', 0 ],
28
+ [ 'uint16v', 'e_shnum', 0 ],
29
+ [ 'uint16v', 'e_shstrndx', 0 ]
30
+ )
31
+
32
+ ELF32_EHDR_MSB = Rex::Struct2::CStructTemplate.new(
33
+ [ 'string', 'e_ident', EI_NIDENT, '' ],
34
+ [ 'uint16n', 'e_type', 0 ],
35
+ [ 'uint16n', 'e_machine', 0 ],
36
+ [ 'uint32n', 'e_version', 0 ],
37
+ [ 'uint32n', 'e_entry', 0 ],
38
+ [ 'uint32n', 'e_phoff', 0 ],
39
+ [ 'uint32n', 'e_shoff', 0 ],
40
+ [ 'uint32n', 'e_flags', 0 ],
41
+ [ 'uint16n', 'e_ehsize', 0 ],
42
+ [ 'uint16n', 'e_phentsize', 0 ],
43
+ [ 'uint16n', 'e_phnum', 0 ],
44
+ [ 'uint16n', 'e_shentsize', 0 ],
45
+ [ 'uint16n', 'e_shnum', 0 ],
46
+ [ 'uint16n', 'e_shstrndx', 0 ]
47
+ )
48
+
49
+ # e_type This member identifies the object file type
50
+
51
+ ET_NONE = 0 # No file type
52
+ ET_REL = 1 # Relocatable file
53
+ ET_EXEC = 2 # Executable file
54
+ ET_DYN = 3 # Shared object file
55
+ ET_CORE = 4 # Core file
56
+ ET_LOPROC = 0xff00 # Processor-specific
57
+ ET_HIPROC = 0xffff # Processor-specific
58
+
59
+ #
60
+ # e_machine This member's value specifies the required architecture for an
61
+ # individual file.
62
+ #
63
+
64
+ # ET_NONE = 0 # No machine
65
+ EM_M32 = 1 # AT&T WE 32100
66
+ EM_SPARC = 2 # SPARC
67
+ EM_386 = 3 # Intel Architecture
68
+ EM_68K = 4 # Motorola 68000
69
+ EM_88K = 5 # Motorola 88000
70
+ EM_860 = 7 # Intel 80860
71
+ EM_MIPS = 8 # MIPS RS3000 Big-Endian
72
+ EM_MIPS_RS4_BE = 10 # MIPS RS4000 Big-Endian
73
+
74
+ # e_version This member identifies the object file version
75
+
76
+ EV_NONE = 0 # Invalid version
77
+ EV_CURRENT = 1 # Current version
78
+
79
+
80
+ # ELF Identification
81
+
82
+ # e_ident[] Identification indexes
83
+
84
+ EI_MAG0 = 0 # File identification
85
+ EI_MAG1 = 1 # File identification
86
+ EI_MAG2 = 2 # File identification
87
+ EI_MAG3 = 3 # File identification
88
+ EI_CLASS = 4 # File class
89
+ EI_DATA = 5 # Data encoding
90
+ EI_VERSION = 6 # File version
91
+ EI_PAD = 7 # Start of padding bytes
92
+ # EI_NIDENT = 16 # Size of e_ident[]
93
+
94
+ #
95
+ # EI_MAG0 to EI_MAG3 A file's first 4 bytes hold a "magic number",
96
+ # identifying the file as an ELF object file.
97
+ #
98
+
99
+ ELFMAG0 = 0x7f # e_ident[EI_MAG0]
100
+ ELFMAG1 = ?E # e_ident[EI_MAG1]
101
+ ELFMAG2 = ?L # e_ident[EI_MAG2]
102
+ ELFMAG3 = ?F # e_ident[EI_MAG3]
103
+
104
+ ELFMAG = ELFMAG0.chr + ELFMAG1.chr + ELFMAG2.chr + ELFMAG3.chr
105
+
106
+ # EI_CLASS Identifies the file's class, or capacity
107
+
108
+ ELFCLASSNONE = 0 # Invalid class
109
+ ELFCLASS32 = 1 # 32-bit objects
110
+ ELFCLASS64 = 2 # 64-bit objects
111
+
112
+ #
113
+ # EI_DATA Specifies the data encoding of the processor-specific data in
114
+ # the object file. The following encodings are currently defined.
115
+ #
116
+
117
+ ELFDATANONE = 0 # Invalid data encoding
118
+ ELFDATA2LSB = 1 # Least significant byte first
119
+ ELFDATA2MSB = 2 # Most significant byte first
120
+
121
+ class GenericStruct
122
+ attr_accessor :struct
123
+ def initialize(_struct)
124
+ self.struct = _struct
125
+ end
126
+
127
+ # The following methods are just pass-throughs for struct
128
+
129
+ # Access a value
130
+ def v
131
+ struct.v
132
+
133
+ end
134
+
135
+ # Access a value by array
136
+ def [](*args)
137
+ struct[*args]
138
+ end
139
+
140
+ # Obtain an array of all fields
141
+ def keys
142
+ struct.keys
143
+ end
144
+
145
+ def method_missing(meth, *args)
146
+ v[meth.to_s] || (raise NoMethodError.new, meth)
147
+ end
148
+ end
149
+
150
+ class GenericHeader < GenericStruct
151
+ end
152
+
153
+ class ElfHeader < GenericHeader
154
+ def initialize(rawdata)
155
+
156
+ # Identify the data encoding and parse ELF Header
157
+ elf_header = ELF32_EHDR_LSB.make_struct
158
+
159
+ if !elf_header.from_s(rawdata)
160
+ raise ElfHeaderError, "Couldn't parse ELF Header", caller
161
+ end
162
+
163
+ if elf_header.v['e_ident'][EI_DATA,1].unpack('C')[0] == ELFDATA2MSB
164
+ elf_header = ELF32_EHDR_MSB.make_struct
165
+
166
+ if !elf_header.from_s(rawdata)
167
+ raise ElfHeaderError, "Couldn't parse ELF Header", caller
168
+ end
169
+ end
170
+
171
+ unless [ ELFDATA2LSB, ELFDATA2MSB ].include?(
172
+ elf_header.v['e_ident'][EI_DATA,1].unpack('C')[0])
173
+ raise ElfHeaderError, "Invalid data encoding", caller
174
+ end
175
+
176
+ # Identify the file as an ELF object file
177
+ unless elf_header.v['e_ident'][EI_MAG0, 4] == ELFMAG
178
+ raise ElfHeaderError, 'Invalid magic number', caller
179
+ end
180
+
181
+ self.struct = elf_header
182
+ end
183
+
184
+ def e_ident
185
+ struct.v['e_ident']
186
+ end
187
+
188
+ end
189
+
190
+
191
+ # Program Header
192
+
193
+ PROGRAM_HEADER_SIZE = 32
194
+
195
+ ELF32_PHDR_LSB = Rex::Struct2::CStructTemplate.new(
196
+ [ 'uint32v', 'p_type', 0 ],
197
+ [ 'uint32v', 'p_offset', 0 ],
198
+ [ 'uint32v', 'p_vaddr', 0 ],
199
+ [ 'uint32v', 'p_paddr', 0 ],
200
+ [ 'uint32v', 'p_filesz', 0 ],
201
+ [ 'uint32v', 'p_memsz', 0 ],
202
+ [ 'uint32v', 'p_flags', 0 ],
203
+ [ 'uint32v', 'p_align', 0 ]
204
+ )
205
+
206
+ ELF32_PHDR_MSB = Rex::Struct2::CStructTemplate.new(
207
+ [ 'uint32n', 'p_type', 0 ],
208
+ [ 'uint32n', 'p_offset', 0 ],
209
+ [ 'uint32n', 'p_vaddr', 0 ],
210
+ [ 'uint32n', 'p_paddr', 0 ],
211
+ [ 'uint32n', 'p_filesz', 0 ],
212
+ [ 'uint32n', 'p_memsz', 0 ],
213
+ [ 'uint32n', 'p_flags', 0 ],
214
+ [ 'uint32n', 'p_align', 0 ]
215
+ )
216
+
217
+ #
218
+ # p_type This member tells what kind of segment this array element
219
+ # describes or how to interpret the array element's information.
220
+ #
221
+
222
+ # Segment Types
223
+
224
+ PT_NULL = 0
225
+ PT_LOAD = 1
226
+ PT_DYNAMIC = 2
227
+ PT_INTERP = 3
228
+ PT_NOTE = 4
229
+ PT_SHLIB = 5
230
+ PT_PHDR = 6
231
+ PT_LOPROC = 0x70000000
232
+ PT_HIPROC = 0x7fffffff
233
+
234
+ class ProgramHeader < GenericHeader
235
+ def initialize(rawdata, ei_data)
236
+ # Identify the data encoding and parse Program Header
237
+ if ei_data == ELFDATA2LSB
238
+ program_header = ELF32_PHDR_LSB.make_struct
239
+ elsif ei_data == ELFDATA2MSB
240
+ program_header = ELF32_PHDR_MSB.make_struct
241
+ else
242
+ raise ElfHeaderError, "Invalid data encoding", caller
243
+ end
244
+
245
+ if !program_header.from_s(rawdata)
246
+ raise ProgramHeaderError, "Couldn't parse Program Header", caller
247
+ end
248
+
249
+ self.struct = program_header
250
+ end
251
+
252
+ end
253
+
254
+ end
255
+ end
256
+ end