librex 0.0.68 → 0.0.70

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