ebfuscator icon indicating copy to clipboard operation
ebfuscator copied to clipboard

capacity overflow with variables containing a null byte

Open darkpills opened this issue 5 years ago • 1 comments

Hello,

First of all, thanks for sharing your amazing work :) !

I encountered an issue while trying to encode a variable that contains null bytes. Sure, it's something you want to avoid.

Here is the example of stub.c:

char *buf = "\xfc\xe8\x82\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50";
int main(void)
{
    return 0;
}

And the stack trace of the execution:

root@kali:~# ./ebfuscator.bin --platform windows --source stub.c --var buf
[+] Created ebfuscator object!
thread 'main' panicked at 'capacity overflow', src/liballoc/raw_vec.rs:777:5
stack backtrace:
   0: 0x5665a5a1 - backtrace::backtrace::libunwind::trace::h16f752dd4ee76200
                       at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.37/src/backtrace/libunwind.rs:88
   1: 0x5665a5a1 - backtrace::backtrace::trace_unsynchronized::h2ba2bfa7865ad587
                       at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.37/src/backtrace/mod.rs:66
   2: 0x5665a5a1 - std::sys_common::backtrace::_print_fmt::h2f1351b1976d265f
                       at src/libstd/sys_common/backtrace.rs:76
   3: 0x5665a5a1 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h152d46d53383c802
                       at src/libstd/sys_common/backtrace.rs:60
   4: 0x56677e2c - core::fmt::write::hc045adef14e6b94f
                       at src/libcore/fmt/mod.rs:1030
   5: 0x5665856c - std::io::Write::write_fmt::h7e9fcfcdd0d56624
                       at src/libstd/io/mod.rs:1412
   6: 0x5665d1a6 - std::sys_common::backtrace::_print::h7edd835b4f8a7f9b
                       at src/libstd/sys_common/backtrace.rs:64
   7: 0x5665d1a6 - std::sys_common::backtrace::print::ha0c27c35e4896b76
                       at src/libstd/sys_common/backtrace.rs:49
   8: 0x5665d1a6 - std::panicking::default_hook::{{closure}}::h136618832afee642
                       at src/libstd/panicking.rs:196
   9: 0x5665ce54 - std::panicking::default_hook::h2473bff1db845bdd
                       at src/libstd/panicking.rs:210
  10: 0x5665d8de - std::panicking::rust_panic_with_hook::h132dac778fab58fb
                       at src/libstd/panicking.rs:473
  11: 0x5665d427 - std::panicking::continue_panic_fmt::hd979e34bcd9bf865
                       at src/libstd/panicking.rs:380
  12: 0x5665d2f9 - rust_begin_unwind
                       at src/libstd/panicking.rs:307
  13: 0x56675808 - core::panicking::panic_fmt::ha7c242a5364092b4
                       at src/libcore/panicking.rs:85
  14: 0x5667573a - core::panicking::panic::haecc773ab902d090
                       at src/libcore/panicking.rs:49
  15: 0x5667364e - alloc::raw_vec::capacity_overflow::h0ba8854432a98919
                       at src/liballoc/raw_vec.rs:777
  16: 0x56572e5c - alloc::raw_vec::RawVec<T,A>::reserve::he80f0637f904f747
  17: 0x5657496c - ebfuscator::transformation::Ebfuscator::_encode_byte_based_on_available_errors_to_postfix::h2aeacf71edff97dd
  18: 0x565756c3 - ebfuscator::transformation::Ebfuscator::transform_file::hde89d4508ffa2f53
  19: 0x5657ccdd - ebfuscator::main::hb0917566dedebebd
  20: 0x56579186 - std::rt::lang_start::{{closure}}::hd27046eca7c2ac51
  21: 0x5665ae26 - std::rt::lang_start_internal::{{closure}}::{{closure}}::h32efad347db94980
                       at src/libstd/rt.rs:49
  22: 0x5665ae26 - std::sys_common::backtrace::__rust_begin_short_backtrace::hdfdd79954d2309a7
                       at src/libstd/sys_common/backtrace.rs:126
  23: 0x5665d26f - std::rt::lang_start_internal::{{closure}}::hec4de49de6cd2409
                       at src/libstd/rt.rs:49
  24: 0x5665d26f - std::panicking::try::do_call::ha962f99896b8510c
                       at src/libstd/panicking.rs:292
  25: 0x56660168 - __rust_maybe_catch_panic
                       at src/libpanic_unwind/lib.rs:80
  26: 0x5665dd36 - std::panicking::try::h017b03878a24dc2c
                       at src/libstd/panicking.rs:271
  27: 0x5665dd36 - std::panic::catch_unwind::he304b66443cc1e42
                       at src/libstd/panic.rs:394
  28: 0x5665dd36 - std::rt::lang_start_internal::hcb84df3ff5b411e2
                       at src/libstd/rt.rs:48
  29: 0x5657d0d1 - main
  30: 0xf7d437e1 - __libc_start_main
  31: 0x56572c11 - <unknown>

darkpills avatar Apr 25 '20 21:04 darkpills

Hey thank you!

I see the problem I'll fix it for today or tomorrow! thanks for reporting it!

The problem is that there is no way to generate Error code 0x00 since it is not implemented into ./errors/{platform}/error.{c,h}

If you want to fix it for you until I fix it what you can do is to add a dummy implementation to generate that error code.

for Windows add this code to the files: ./errors/windows/error.c void generate_error_0(void) { SetLastError(0); } ./errors/windows/error.h void generate_error_0(void);

for Linux add this code to the files: ./errors/linux/error.c extern int errno; void generate_error_0(void) { errno = 0; } ./errors/linux/error.h void generate_error_0(void);

This should work for you until I patch it

d00rt avatar Apr 27 '20 08:04 d00rt