librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  module Rex
@@ -10,503 +9,514 @@ module Arch
10
9
 
11
10
  module X86
12
11
 
13
- #
14
- # Register number constants
15
- #
16
- EAX = AL = AX = ES = 0
17
- ECX = CL = CX = CS = 1
18
- EDX = DL = DX = SS = 2
19
- EBX = BL = BX = DS = 3
20
- ESP = AH = SP = FS = 4
21
- EBP = CH = BP = GS = 5
22
- ESI = DH = SI = 6
23
- EDI = BH = DI = 7
24
-
25
- REG_NAMES32 = [ 'eax', 'ecx', 'edx', 'ebx',
26
- 'esp', 'ebp', 'esi', 'edi' ] # :nodoc:
27
-
28
- # Jump tp a specific register
29
- def self.jmp_reg(str)
30
- reg = reg_number(str)
31
- _check_reg(reg)
32
- "\xFF" + [224 + reg].pack('C')
33
- end
34
-
35
- # This method returns the opcodes that compose a jump instruction to the
36
- # supplied relative offset.
37
- def self.jmp(addr)
38
- "\xe9" + pack_dword(rel_number(addr))
39
- end
40
-
41
- #
42
- # This method adds/subs a packed long integer
43
- #
44
- def self.dword_adjust(dword, amount=0)
45
- pack_dword(dword.unpack('V')[0] + amount)
46
- end
47
-
48
- #
49
- # This method returns the opcodes that compose a tag-based search routine
50
- #
51
- def self.searcher(tag)
52
- "\xbe" + dword_adjust(tag,-1)+ # mov esi, Tag - 1
53
- "\x46" + # inc esi
54
- "\x47" + # inc edi (end_search:)
55
- "\x39\x37" + # cmp [edi],esi
56
- "\x75\xfb" + # jnz 0xa (end_search)
57
- "\x46" + # inc esi
58
- "\x4f" + # dec edi (start_search:)
59
- "\x39\x77\xfc" + # cmp [edi-0x4],esi
60
- "\x75\xfa" + # jnz 0x10 (start_search)
61
- jmp_reg('edi') # jmp edi
62
- end
63
-
64
- #
65
- # Generates a buffer that will copy memory immediately following the stub
66
- # that is generated to be copied to the stack
67
- #
68
- def self.copy_to_stack(len)
69
- # four byte align
70
- len = (len + 3) & ~0x3
71
-
72
- stub =
73
- "\xeb\x0f"+ # jmp _end
74
- push_dword(len)+ # push n
75
- "\x59"+ # pop ecx
76
- "\x5e"+ # pop esi
77
- "\x29\xcc"+ # sub esp, ecx
78
- "\x89\xe7"+ # mov edi, esp
79
- "\xf3\xa4"+ # rep movsb
80
- "\xff\xe4"+ # jmp esp
81
- "\xe8\xec\xff\xff\xff" # call _start
82
-
83
- stub
84
- end
85
-
86
- #
87
- # This method returns the opcodes that compose a short jump instruction to
88
- # the supplied relative offset.
89
- #
90
- def self.jmp_short(addr)
91
- "\xeb" + pack_lsb(rel_number(addr, -2))
92
- end
93
-
94
- #
95
- # This method returns the opcodes that compose a relative call instruction
96
- # to the address specified.
97
- #
98
- def self.call(addr)
99
- "\xe8" + pack_dword(rel_number(addr, -5))
100
- end
101
-
102
- #
103
- # This method returns a number offset to the supplied string.
104
- #
105
- def self.rel_number(num, delta = 0)
106
- s = num.to_s
107
-
108
- case s[0, 2]
109
- when '$+'
110
- num = s[2 .. -1].to_i
111
- when '$-'
112
- num = -1 * s[2 .. -1].to_i
113
- when '0x'
114
- num = s.hex
115
- else
116
- delta = 0
117
- end
118
-
119
- return num + delta
120
- end
121
-
122
- #
123
- # This method returns the number associated with a named register.
124
- #
125
- def self.reg_number(str)
126
- return self.const_get(str.upcase)
127
- end
128
-
129
- #
130
- # This method returns the register named associated with a given register
131
- # number.
132
- #
133
- def self.reg_name32(num)
134
- _check_reg(num)
135
- return REG_NAMES32[num].dup
136
- end
137
-
138
- #
139
- # This method generates the encoded effective value for a register.
140
- #
141
- def self.encode_effective(shift, dst)
142
- return (0xc0 | (shift << 3) | dst)
143
- end
144
-
145
- #
146
- # This method generates the mod r/m character for a source and destination
147
- # register.
148
- #
149
- def self.encode_modrm(dst, src)
150
- _check_reg(dst, src)
151
- return (0xc0 | src | dst << 3).chr
152
- end
153
-
154
- #
155
- # This method generates a push byte instruction.
156
- #
157
- def self.push_byte(byte)
158
- # push byte will sign extend...
159
- if byte < 128 && byte >= -128
160
- return "\x6a" + (byte & 0xff).chr
161
- end
162
- raise ::ArgumentError, "Can only take signed byte values!", caller()
163
- end
164
-
165
- #
166
- # This method generates a push word instruction.
167
- #
168
- def self.push_word(val)
169
- return "\x66\x68" + pack_word(val)
170
- end
171
-
172
- #
173
- # This method generates a push dword instruction.
174
- #
175
- def self.push_dword(val)
176
- return "\x68" + pack_dword(val)
177
- end
178
-
179
- #
180
- # This method generates a pop dword instruction into a register.
181
- #
182
- def self.pop_dword(dst)
183
- _check_reg(dst)
184
- return (0x58 | dst).chr
185
- end
186
-
187
- #
188
- # This method generates an instruction that clears the supplied register in
189
- # a manner that attempts to avoid bad characters, if supplied.
190
- #
191
- def self.clear(reg, badchars = '')
192
- _check_reg(reg)
193
- return set(reg, 0, badchars)
194
- end
195
-
196
- #
197
- # This method generates the opcodes that set the low byte of a given
198
- # register to the supplied value.
199
- #
200
- def self.mov_byte(reg, val)
201
- _check_reg(reg)
202
- # chr will raise RangeError if val not between 0 .. 255
203
- return (0xb0 | reg).chr + val.chr
204
- end
205
-
206
- #
207
- # This method generates the opcodes that set the low word of a given
208
- # register to the supplied value.
209
- #
210
- def self.mov_word(reg, val)
211
- _check_reg(reg)
212
- if val < 0 || val > 0xffff
213
- raise RangeError, "Can only take unsigned word values!", caller()
214
- end
215
- return "\x66" + (0xb8 | reg).chr + pack_word(val)
216
- end
217
-
218
- #
219
- # This method generates the opcodes that set the a register to the
220
- # supplied value.
221
- #
222
- def self.mov_dword(reg, val)
223
- _check_reg(reg)
224
- return (0xb8 | reg).chr + pack_dword(val)
225
- end
226
-
227
- #
228
- # This method is a general way of setting a register to a value. Depending
229
- # on the value supplied, different sets of instructions may be used.
230
- #
231
- # TODO: Make this moderatly intelligent so it chain instructions by itself
232
- # (ie. xor eax, eax + mov al, 4 + xchg ah, al)
233
- def self.set(dst, val, badchars = '')
234
- _check_reg(dst)
235
-
236
- # If the value is 0 try xor/sub dst, dst (2 bytes)
237
- if(val == 0)
238
- opcodes = Rex::Text.remove_badchars("\x29\x2b\x31\x33", badchars)
239
- if !opcodes.empty?
240
- return opcodes[rand(opcodes.length)].chr + encode_modrm(dst, dst)
241
- end
12
+ #
13
+ # Register number constants
14
+ #
15
+ EAX = AL = AX = ES = 0
16
+ ECX = CL = CX = CS = 1
17
+ EDX = DL = DX = SS = 2
18
+ EBX = BL = BX = DS = 3
19
+ ESP = AH = SP = FS = 4
20
+ EBP = CH = BP = GS = 5
21
+ ESI = DH = SI = 6
22
+ EDI = BH = DI = 7
23
+
24
+ REG_NAMES32 = [ 'eax', 'ecx', 'edx', 'ebx', 'esp', 'ebp', 'esi', 'edi' ]
25
+
26
+ REG_NAMES16 = [ 'ax', 'cx', 'dx', 'bx', 'sp', 'bp', 'si', 'di' ]
27
+
28
+ REG_NAMES8L = [ 'al', 'cl', 'dl', 'bl', nil, nil, nil, nil ]
29
+
30
+ # Jump tp a specific register
31
+ def self.jmp_reg(str)
32
+ reg = reg_number(str)
33
+ _check_reg(reg)
34
+ "\xFF" + [224 + reg].pack('C')
35
+ end
36
+
37
+ #
38
+ # Generate a LOOP instruction (Decrement ECX and jump short if ECX == 0)
39
+ #
40
+ def self.loop(offset)
41
+ "\xE2" + pack_lsb(rel_number(offset, -2))
42
+ end
43
+
44
+ #
45
+ # This method returns the opcodes that compose a jump instruction to the
46
+ # supplied relative offset.
47
+ def self.jmp(addr)
48
+ "\xe9" + pack_dword(rel_number(addr))
49
+ end
50
+
51
+ #
52
+ # This method adds/subs a packed long integer
53
+ #
54
+ def self.dword_adjust(dword, amount=0)
55
+ pack_dword(dword.unpack('V')[0] + amount)
56
+ end
57
+
58
+ #
59
+ # This method returns the opcodes that compose a tag-based search routine
60
+ #
61
+ def self.searcher(tag)
62
+ "\xbe" + dword_adjust(tag,-1)+ # mov esi, Tag - 1
63
+ "\x46" + # inc esi
64
+ "\x47" + # inc edi (end_search:)
65
+ "\x39\x37" + # cmp [edi],esi
66
+ "\x75\xfb" + # jnz 0xa (end_search)
67
+ "\x46" + # inc esi
68
+ "\x4f" + # dec edi (start_search:)
69
+ "\x39\x77\xfc" + # cmp [edi-0x4],esi
70
+ "\x75\xfa" + # jnz 0x10 (start_search)
71
+ jmp_reg('edi') # jmp edi
72
+ end
73
+
74
+ #
75
+ # Generates a buffer that will copy memory immediately following the stub
76
+ # that is generated to be copied to the stack
77
+ #
78
+ def self.copy_to_stack(len)
79
+ # four byte align
80
+ len = (len + 3) & ~0x3
81
+
82
+ stub =
83
+ "\xeb\x0f"+ # jmp _end
84
+ push_dword(len)+ # push n
85
+ "\x59"+ # pop ecx
86
+ "\x5e"+ # pop esi
87
+ "\x29\xcc"+ # sub esp, ecx
88
+ "\x89\xe7"+ # mov edi, esp
89
+ "\xf3\xa4"+ # rep movsb
90
+ "\xff\xe4"+ # jmp esp
91
+ "\xe8\xec\xff\xff\xff" # call _start
92
+
93
+ stub
94
+ end
95
+
96
+ #
97
+ # This method returns the opcodes that compose a short jump instruction to
98
+ # the supplied relative offset.
99
+ #
100
+ def self.jmp_short(addr)
101
+ "\xeb" + pack_lsb(rel_number(addr, -2))
102
+ end
103
+
104
+ #
105
+ # This method returns the opcodes that compose a relative call instruction
106
+ # to the address specified.
107
+ #
108
+ def self.call(addr)
109
+ "\xe8" + pack_dword(rel_number(addr, -5))
110
+ end
111
+
112
+ #
113
+ # This method returns a number offset to the supplied string.
114
+ #
115
+ def self.rel_number(num, delta = 0)
116
+ s = num.to_s
117
+
118
+ case s[0, 2]
119
+ when '$+'
120
+ num = s[2 .. -1].to_i
121
+ when '$-'
122
+ num = -1 * s[2 .. -1].to_i
123
+ when '0x'
124
+ num = s.hex
125
+ else
126
+ delta = 0
127
+ end
128
+
129
+ return num + delta
130
+ end
131
+
132
+ #
133
+ # This method returns the number associated with a named register.
134
+ #
135
+ def self.reg_number(str)
136
+ return self.const_get(str.upcase)
137
+ end
138
+
139
+ #
140
+ # This method returns the register named associated with a given register
141
+ # number.
142
+ #
143
+ def self.reg_name32(num)
144
+ _check_reg(num)
145
+ return REG_NAMES32[num].dup
146
+ end
147
+
148
+ #
149
+ # This method generates the encoded effective value for a register.
150
+ #
151
+ def self.encode_effective(shift, dst)
152
+ return (0xc0 | (shift << 3) | dst)
153
+ end
154
+
155
+ #
156
+ # This method generates the mod r/m character for a source and destination
157
+ # register.
158
+ #
159
+ def self.encode_modrm(dst, src)
160
+ _check_reg(dst, src)
161
+ return (0xc0 | src | dst << 3).chr
162
+ end
163
+
164
+ #
165
+ # This method generates a push byte instruction.
166
+ #
167
+ def self.push_byte(byte)
168
+ # push byte will sign extend...
169
+ if byte < 128 && byte >= -128
170
+ return "\x6a" + (byte & 0xff).chr
171
+ end
172
+ raise ::ArgumentError, "Can only take signed byte values!", caller()
173
+ end
174
+
175
+ #
176
+ # This method generates a push word instruction.
177
+ #
178
+ def self.push_word(val)
179
+ return "\x66\x68" + pack_word(val)
180
+ end
181
+
182
+ #
183
+ # This method generates a push dword instruction.
184
+ #
185
+ def self.push_dword(val)
186
+ return "\x68" + pack_dword(val)
187
+ end
188
+
189
+ #
190
+ # This method generates a pop dword instruction into a register.
191
+ #
192
+ def self.pop_dword(dst)
193
+ _check_reg(dst)
194
+ return (0x58 | dst).chr
195
+ end
196
+
197
+ #
198
+ # This method generates an instruction that clears the supplied register in
199
+ # a manner that attempts to avoid bad characters, if supplied.
200
+ #
201
+ def self.clear(reg, badchars = '')
202
+ _check_reg(reg)
203
+ return set(reg, 0, badchars)
204
+ end
205
+
206
+ #
207
+ # This method generates the opcodes that set the low byte of a given
208
+ # register to the supplied value.
209
+ #
210
+ def self.mov_byte(reg, val)
211
+ _check_reg(reg)
212
+ # chr will raise RangeError if val not between 0 .. 255
213
+ return (0xb0 | reg).chr + val.chr
214
+ end
215
+
216
+ #
217
+ # This method generates the opcodes that set the low word of a given
218
+ # register to the supplied value.
219
+ #
220
+ def self.mov_word(reg, val)
221
+ _check_reg(reg)
222
+ if val < 0 || val > 0xffff
223
+ raise RangeError, "Can only take unsigned word values!", caller()
224
+ end
225
+ return "\x66" + (0xb8 | reg).chr + pack_word(val)
226
+ end
227
+
228
+ #
229
+ # This method generates the opcodes that set the a register to the
230
+ # supplied value.
231
+ #
232
+ def self.mov_dword(reg, val)
233
+ _check_reg(reg)
234
+ return (0xb8 | reg).chr + pack_dword(val)
235
+ end
236
+
237
+ #
238
+ # This method is a general way of setting a register to a value. Depending
239
+ # on the value supplied, different sets of instructions may be used.
240
+ #
241
+ # TODO: Make this moderatly intelligent so it chain instructions by itself
242
+ # (ie. xor eax, eax + mov al, 4 + xchg ah, al)
243
+ def self.set(dst, val, badchars = '')
244
+ _check_reg(dst)
245
+
246
+ # If the value is 0 try xor/sub dst, dst (2 bytes)
247
+ if(val == 0)
248
+ opcodes = Rex::Text.remove_badchars("\x29\x2b\x31\x33", badchars)
249
+ if !opcodes.empty?
250
+ return opcodes[rand(opcodes.length)].chr + encode_modrm(dst, dst)
251
+ end
242
252
  # TODO: SHL/SHR
243
253
  # TODO: AND
244
- end
245
-
246
- # try push BYTE val; pop dst (3 bytes)
247
- begin
248
- return _check_badchars(push_byte(val) + pop_dword(dst), badchars)
249
- rescue ::ArgumentError, ::RuntimeError, ::RangeError
250
- end
251
-
252
- # try clear dst, mov BYTE dst (4 bytes)
253
- begin
254
- # break if val == 0
255
- return _check_badchars(clear(dst, badchars) + mov_byte(dst, val), badchars)
256
- rescue ::ArgumentError, ::RuntimeError, ::RangeError
257
- end
258
-
259
- # try mov DWORD dst (5 bytes)
260
- begin
261
- return _check_badchars(mov_dword(dst, val), badchars)
262
- rescue ::ArgumentError, ::RuntimeError, ::RangeError
263
- end
264
-
265
- # try push DWORD, pop dst (6 bytes)
266
- begin
267
- return _check_badchars(push_dword(val) + pop_dword(dst), badchars)
268
- rescue ::ArgumentError, ::RuntimeError, ::RangeError
269
- end
270
-
271
- # try clear dst, mov WORD dst (6 bytes)
272
- begin
273
- # break if val == 0
274
- return _check_badchars(clear(dst, badchars) + mov_word(dst, val), badchars)
275
- rescue ::ArgumentError, ::RuntimeError, ::RangeError
276
- end
277
-
278
- raise RuntimeError, "No valid set instruction could be created!", caller()
279
- end
280
-
281
- #
282
- # Builds a subtraction instruction using the supplied operand
283
- # and register.
284
- #
285
- def self.sub(val, reg, badchars = '', add = false, adjust = false, bits = 0)
286
- opcodes = []
287
- shift = (add == true) ? 0 : 5
288
-
289
- if (bits <= 8 and val >= -0x7f and val <= 0x7f)
290
- opcodes <<
291
- ((adjust) ? '' : clear(reg, badchars)) +
292
- "\x83" +
293
- [ encode_effective(shift, reg) ].pack('C') +
294
- [ val.to_i ].pack('C')
295
- end
296
-
297
- if (bits <= 16 and val >= -0xffff and val <= 0)
298
- opcodes <<
299
- ((adjust) ? '' : clear(reg, badchars)) +
300
- "\x66\x81" +
301
- [ encode_effective(shift, reg) ].pack('C') +
302
- [ val.to_i ].pack('v')
303
- end
304
-
305
- opcodes <<
306
- ((adjust) ? '' : clear(reg, badchars)) +
307
- "\x81" +
308
- [ encode_effective(shift, reg) ].pack('C') +
309
- [ val.to_i ].pack('V')
310
-
311
- # Search for a compatible opcode
312
- opcodes.each { |op|
313
- begin
314
- _check_badchars(op, badchars)
315
- rescue
316
- next
317
- end
318
-
319
- return op
320
- }
321
-
322
- if opcodes.empty?
323
- raise RuntimeError, "Could not find a usable opcode", caller()
324
- end
325
- end
326
-
327
- #
328
- # This method generates the opcodes equivalent to subtracting with a
329
- # negative value from a given register.
330
- #
331
- def self.add(val, reg, badchars = '', adjust = false, bits = 0)
332
- sub(val, reg, badchars, true, adjust, bits)
333
- end
334
-
335
- #
336
- # This method wrappers packing a short integer as a little-endian buffer.
337
- #
338
- def self.pack_word(num)
339
- [num].pack('v')
340
- end
341
-
342
- #
343
- # This method wrappers packing an integer as a little-endian buffer.
344
- #
345
- def self.pack_dword(num)
346
- [num].pack('V')
347
- end
348
-
349
- #
350
- # This method returns the least significant byte of a packed dword.
351
- #
352
- def self.pack_lsb(num)
353
- pack_dword(num)[0,1]
354
- end
355
-
356
- #
357
- # This method adjusts the value of the ESP register by a given amount.
358
- #
359
- def self.adjust_reg(reg, adjustment)
360
- if (adjustment > 0)
361
- sub(adjustment, reg, '', false, false, 32)
362
- else
363
- add(adjustment, reg, '', true, 32)
364
- end
365
- end
366
-
367
- def self._check_reg(*regs) # :nodoc:
368
- regs.each { |reg|
369
- if reg > 7 || reg < 0
370
- raise ArgumentError, "Invalid register #{reg}", caller()
371
- end
372
- }
373
- return nil
374
- end
375
-
376
- def self._check_badchars(data, badchars) # :nodoc:
377
- idx = Rex::Text.badchar_index(data, badchars)
378
- if idx
379
- raise RuntimeError, "Bad character at #{idx}", caller()
380
- end
381
- return data
382
- end
383
-
384
- #
385
- # This method returns an array of 'safe' FPU instructions
386
- #
387
- def self.fpu_instructions
388
- fpus = []
389
-
390
- 0xe8.upto(0xee) { |x| fpus << "\xd9" + x.chr }
391
- 0xc0.upto(0xcf) { |x| fpus << "\xd9" + x.chr }
392
- 0xc0.upto(0xdf) { |x| fpus << "\xda" + x.chr }
393
- 0xc0.upto(0xdf) { |x| fpus << "\xdb" + x.chr }
394
- 0xc0.upto(0xc7) { |x| fpus << "\xdd" + x.chr }
395
-
396
- fpus << "\xd9\xd0"
397
- fpus << "\xd9\xe1"
398
- fpus << "\xd9\xf6"
399
- fpus << "\xd9\xf7"
400
- fpus << "\xd9\xe5"
401
-
402
- # This FPU instruction seems to fail consistently on Linux
403
- #fpus << "\xdb\xe1"
404
-
405
- fpus
406
- end
407
-
408
- #
409
- # This method returns an array containing a geteip stub, a register, and an offset
410
- # This method will return nil if the getip generation fails
411
- #
412
- def self.geteip_fpu(badchars)
413
-
414
- #
415
- # Default badchars to an empty string
416
- #
417
- badchars ||= ''
418
-
419
- #
420
- # Bail out early if D9 is restricted
421
- #
422
- return nil if badchars.index("\xd9")
423
-
424
- #
425
- # Create a list of FPU instructions
426
- #
427
- fpus = *self.fpu_instructions
428
- bads = []
429
- badchars.each_byte do |c|
430
- fpus.each do |str|
431
- bads << str if (str.index(c.chr))
432
- end
433
- end
434
- bads.each { |str| fpus.delete(str) }
435
- return nil if fpus.length == 0
436
-
437
- #
438
- # Create a list of registers to use for fnstenv
439
- #
440
- dsts = []
441
- 0.upto(7) do |c|
442
- dsts << c if (not badchars.index( (0x70+c).chr ))
443
- end
444
-
445
- if (dsts.include?(ESP) and badchars.index("\x24"))
446
- dsts.delete(ESP)
447
- end
448
-
449
- return nil if dsts.length == 0
450
-
451
- #
452
- # Grab a random FPU instruction
453
- #
454
- fpu = fpus[ rand(fpus.length) ]
455
-
456
- #
457
- # Grab a random register from dst
458
- #
459
- while(dsts.length > 0)
460
- buf = ''
461
- dst = dsts[ rand(dsts.length) ]
462
- dsts.delete(dst)
463
-
464
- # If the register is not ESP, copy ESP
465
- if (dst != ESP)
466
- next if badchars.index( (0x70 + dst).chr )
467
-
468
- if !(badchars.index("\x89") or badchars.index( (0xE0+dst).chr ))
469
- buf << "\x89" + (0xE0 + dst).chr
470
- else
471
- next if badchars.index("\x54")
472
- next if badchars.index( (0x58+dst).chr )
473
- buf << "\x54" + (0x58 + dst).chr
474
- end
475
- end
476
-
477
- pad = 0
478
- while (pad < (128-12) and badchars.index( (256-12-pad).chr))
479
- pad += 4
480
- end
481
-
482
- # Give up on finding a value to use here
483
- if (pad == (128-12))
484
- return nil
485
- end
486
-
487
- out = buf + fpu + "\xd9" + (0x70 + dst).chr
488
- out << "\x24" if dst == ESP
489
- out << (256-12-pad).chr
490
-
491
- regs = [*(0..7)]
492
- while (regs.length > 0)
493
- reg = regs[ rand(regs.length) ]
494
- regs.delete(reg)
495
- next if reg == ESP
496
- next if badchars.index( (0x58 + reg).chr )
497
-
498
- # Pop the value back out
499
- 0.upto(pad / 4) { |c| out << (0x58 + reg).chr }
500
-
501
- # Fix the value to point to self
502
- gap = out.length - buf.length
503
-
504
- return [out, REG_NAMES32[reg].upcase, gap]
505
- end
506
- end
507
-
508
- return nil
509
- end
254
+ end
255
+
256
+ # try push BYTE val; pop dst (3 bytes)
257
+ begin
258
+ return _check_badchars(push_byte(val) + pop_dword(dst), badchars)
259
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
260
+ end
261
+
262
+ # try clear dst, mov BYTE dst (4 bytes)
263
+ begin
264
+ # break if val == 0
265
+ return _check_badchars(clear(dst, badchars) + mov_byte(dst, val), badchars)
266
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
267
+ end
268
+
269
+ # try mov DWORD dst (5 bytes)
270
+ begin
271
+ return _check_badchars(mov_dword(dst, val), badchars)
272
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
273
+ end
274
+
275
+ # try push DWORD, pop dst (6 bytes)
276
+ begin
277
+ return _check_badchars(push_dword(val) + pop_dword(dst), badchars)
278
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
279
+ end
280
+
281
+ # try clear dst, mov WORD dst (6 bytes)
282
+ begin
283
+ # break if val == 0
284
+ return _check_badchars(clear(dst, badchars) + mov_word(dst, val), badchars)
285
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
286
+ end
287
+
288
+ raise RuntimeError, "No valid set instruction could be created!", caller()
289
+ end
290
+
291
+ #
292
+ # Builds a subtraction instruction using the supplied operand
293
+ # and register.
294
+ #
295
+ def self.sub(val, reg, badchars = '', add = false, adjust = false, bits = 0)
296
+ opcodes = []
297
+ shift = (add == true) ? 0 : 5
298
+
299
+ if (bits <= 8 and val >= -0x7f and val <= 0x7f)
300
+ opcodes <<
301
+ ((adjust) ? '' : clear(reg, badchars)) +
302
+ "\x83" +
303
+ [ encode_effective(shift, reg) ].pack('C') +
304
+ [ val.to_i ].pack('C')
305
+ end
306
+
307
+ if (bits <= 16 and val >= -0xffff and val <= 0)
308
+ opcodes <<
309
+ ((adjust) ? '' : clear(reg, badchars)) +
310
+ "\x66\x81" +
311
+ [ encode_effective(shift, reg) ].pack('C') +
312
+ [ val.to_i ].pack('v')
313
+ end
314
+
315
+ opcodes <<
316
+ ((adjust) ? '' : clear(reg, badchars)) +
317
+ "\x81" +
318
+ [ encode_effective(shift, reg) ].pack('C') +
319
+ [ val.to_i ].pack('V')
320
+
321
+ # Search for a compatible opcode
322
+ opcodes.each { |op|
323
+ begin
324
+ _check_badchars(op, badchars)
325
+ rescue
326
+ next
327
+ end
328
+
329
+ return op
330
+ }
331
+
332
+ if opcodes.empty?
333
+ raise RuntimeError, "Could not find a usable opcode", caller()
334
+ end
335
+ end
336
+
337
+ #
338
+ # This method generates the opcodes equivalent to subtracting with a
339
+ # negative value from a given register.
340
+ #
341
+ def self.add(val, reg, badchars = '', adjust = false, bits = 0)
342
+ sub(val, reg, badchars, true, adjust, bits)
343
+ end
344
+
345
+ #
346
+ # This method wrappers packing a short integer as a little-endian buffer.
347
+ #
348
+ def self.pack_word(num)
349
+ [num].pack('v')
350
+ end
351
+
352
+ #
353
+ # This method wrappers packing an integer as a little-endian buffer.
354
+ #
355
+ def self.pack_dword(num)
356
+ [num].pack('V')
357
+ end
358
+
359
+ #
360
+ # This method returns the least significant byte of a packed dword.
361
+ #
362
+ def self.pack_lsb(num)
363
+ pack_dword(num)[0,1]
364
+ end
365
+
366
+ #
367
+ # This method adjusts the value of the ESP register by a given amount.
368
+ #
369
+ def self.adjust_reg(reg, adjustment)
370
+ if (adjustment > 0)
371
+ sub(adjustment, reg, '', false, false, 32)
372
+ else
373
+ add(adjustment, reg, '', true, 32)
374
+ end
375
+ end
376
+
377
+ def self._check_reg(*regs) # :nodoc:
378
+ regs.each { |reg|
379
+ if reg > 7 || reg < 0
380
+ raise ArgumentError, "Invalid register #{reg}", caller()
381
+ end
382
+ }
383
+ return nil
384
+ end
385
+
386
+ def self._check_badchars(data, badchars) # :nodoc:
387
+ idx = Rex::Text.badchar_index(data, badchars)
388
+ if idx
389
+ raise RuntimeError, "Bad character at #{idx}", caller()
390
+ end
391
+ return data
392
+ end
393
+
394
+ #
395
+ # This method returns an array of 'safe' FPU instructions
396
+ #
397
+ def self.fpu_instructions
398
+ fpus = []
399
+
400
+ 0xe8.upto(0xee) { |x| fpus << "\xd9" + x.chr }
401
+ 0xc0.upto(0xcf) { |x| fpus << "\xd9" + x.chr }
402
+ 0xc0.upto(0xdf) { |x| fpus << "\xda" + x.chr }
403
+ 0xc0.upto(0xdf) { |x| fpus << "\xdb" + x.chr }
404
+ 0xc0.upto(0xc7) { |x| fpus << "\xdd" + x.chr }
405
+
406
+ fpus << "\xd9\xd0"
407
+ fpus << "\xd9\xe1"
408
+ fpus << "\xd9\xf6"
409
+ fpus << "\xd9\xf7"
410
+ fpus << "\xd9\xe5"
411
+
412
+ # This FPU instruction seems to fail consistently on Linux
413
+ #fpus << "\xdb\xe1"
414
+
415
+ fpus
416
+ end
417
+
418
+ #
419
+ # This method returns an array containing a geteip stub, a register, and an offset
420
+ # This method will return nil if the getip generation fails
421
+ #
422
+ def self.geteip_fpu(badchars)
423
+
424
+ #
425
+ # Default badchars to an empty string
426
+ #
427
+ badchars ||= ''
428
+
429
+ #
430
+ # Bail out early if D9 is restricted
431
+ #
432
+ return nil if badchars.index("\xd9")
433
+
434
+ #
435
+ # Create a list of FPU instructions
436
+ #
437
+ fpus = *self.fpu_instructions
438
+ bads = []
439
+ badchars.each_byte do |c|
440
+ fpus.each do |str|
441
+ bads << str if (str.index(c.chr))
442
+ end
443
+ end
444
+ bads.each { |str| fpus.delete(str) }
445
+ return nil if fpus.length == 0
446
+
447
+ #
448
+ # Create a list of registers to use for fnstenv
449
+ #
450
+ dsts = []
451
+ 0.upto(7) do |c|
452
+ dsts << c if (not badchars.index( (0x70+c).chr ))
453
+ end
454
+
455
+ if (dsts.include?(ESP) and badchars.index("\x24"))
456
+ dsts.delete(ESP)
457
+ end
458
+
459
+ return nil if dsts.length == 0
460
+
461
+ #
462
+ # Grab a random FPU instruction
463
+ #
464
+ fpu = fpus[ rand(fpus.length) ]
465
+
466
+ #
467
+ # Grab a random register from dst
468
+ #
469
+ while(dsts.length > 0)
470
+ buf = ''
471
+ dst = dsts[ rand(dsts.length) ]
472
+ dsts.delete(dst)
473
+
474
+ # If the register is not ESP, copy ESP
475
+ if (dst != ESP)
476
+ next if badchars.index( (0x70 + dst).chr )
477
+
478
+ if !(badchars.index("\x89") or badchars.index( (0xE0+dst).chr ))
479
+ buf << "\x89" + (0xE0 + dst).chr
480
+ else
481
+ next if badchars.index("\x54")
482
+ next if badchars.index( (0x58+dst).chr )
483
+ buf << "\x54" + (0x58 + dst).chr
484
+ end
485
+ end
486
+
487
+ pad = 0
488
+ while (pad < (128-12) and badchars.index( (256-12-pad).chr))
489
+ pad += 4
490
+ end
491
+
492
+ # Give up on finding a value to use here
493
+ if (pad == (128-12))
494
+ return nil
495
+ end
496
+
497
+ out = buf + fpu + "\xd9" + (0x70 + dst).chr
498
+ out << "\x24" if dst == ESP
499
+ out << (256-12-pad).chr
500
+
501
+ regs = [*(0..7)]
502
+ while (regs.length > 0)
503
+ reg = regs[ rand(regs.length) ]
504
+ regs.delete(reg)
505
+ next if reg == ESP
506
+ next if badchars.index( (0x58 + reg).chr )
507
+
508
+ # Pop the value back out
509
+ 0.upto(pad / 4) { |c| out << (0x58 + reg).chr }
510
+
511
+ # Fix the value to point to self
512
+ gap = out.length - buf.length
513
+
514
+ return [out, REG_NAMES32[reg].upcase, gap]
515
+ end
516
+ end
517
+
518
+ return nil
519
+ end
510
520
 
511
521
  end
512
522