mirror of
https://github.com/BishopFox/sliver
synced 2026-06-08 10:29:05 +00:00
101 lines
3.3 KiB
Go
101 lines
3.3 KiB
Go
package exec
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func TestParseExecuteShellcodeFlagsDefaults(t *testing.T) {
|
|
cmd := newExecuteShellcodeFlagsTestCommand(t)
|
|
|
|
cfg, changed, err := parseExecuteShellcodeFlags(cmd)
|
|
if err != nil {
|
|
t.Fatalf("parseExecuteShellcodeFlags returned error: %v", err)
|
|
}
|
|
if changed {
|
|
t.Fatalf("expected changed=false with defaults")
|
|
}
|
|
if cfg == nil {
|
|
t.Fatalf("expected non-nil config")
|
|
}
|
|
if cfg.Entropy != 1 || cfg.Compress != 1 || cfg.ExitOpt != 1 || cfg.Bypass != 3 || cfg.Headers != 1 {
|
|
t.Fatalf("unexpected defaults: %+v", cfg)
|
|
}
|
|
if cfg.Thread || cfg.Unicode || cfg.OEP != 0 {
|
|
t.Fatalf("unexpected default bool/OEP values: %+v", cfg)
|
|
}
|
|
}
|
|
|
|
func TestParseExecuteShellcodeFlagsChanged(t *testing.T) {
|
|
cmd := newExecuteShellcodeFlagsTestCommand(t)
|
|
if err := cmd.Flags().Set("shellcode-entropy", "2"); err != nil {
|
|
t.Fatalf("set shellcode-entropy: %v", err)
|
|
}
|
|
if err := cmd.Flags().Set("shellcode-compress", "true"); err != nil {
|
|
t.Fatalf("set shellcode-compress: %v", err)
|
|
}
|
|
if err := cmd.Flags().Set("shellcode-thread", "true"); err != nil {
|
|
t.Fatalf("set shellcode-thread: %v", err)
|
|
}
|
|
|
|
cfg, changed, err := parseExecuteShellcodeFlags(cmd)
|
|
if err != nil {
|
|
t.Fatalf("parseExecuteShellcodeFlags returned error: %v", err)
|
|
}
|
|
if !changed {
|
|
t.Fatalf("expected changed=true")
|
|
}
|
|
if cfg.Entropy != 2 || cfg.Compress != 2 || !cfg.Thread {
|
|
t.Fatalf("unexpected changed config: %+v", cfg)
|
|
}
|
|
}
|
|
|
|
func TestParseExecuteShellcodeFlagsValidation(t *testing.T) {
|
|
cmd := newExecuteShellcodeFlagsTestCommand(t)
|
|
if err := cmd.Flags().Set("shellcode-bypass", "9"); err != nil {
|
|
t.Fatalf("set shellcode-bypass: %v", err)
|
|
}
|
|
if _, _, err := parseExecuteShellcodeFlags(cmd); err == nil {
|
|
t.Fatalf("expected validation error for shellcode-bypass")
|
|
}
|
|
}
|
|
|
|
func TestShouldConvertExecuteShellcodePE(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
path string
|
|
flagsChanged bool
|
|
wantConvert bool
|
|
wantDLL bool
|
|
}{
|
|
{name: "exe by extension", path: "/tmp/payload.exe", flagsChanged: false, wantConvert: true, wantDLL: false},
|
|
{name: "dll by extension", path: "/tmp/payload.dll", flagsChanged: false, wantConvert: true, wantDLL: true},
|
|
{name: "raw shellcode", path: "/tmp/payload.bin", flagsChanged: false, wantConvert: false, wantDLL: false},
|
|
{name: "flags force conversion", path: "/tmp/payload.bin", flagsChanged: true, wantConvert: true, wantDLL: false},
|
|
}
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
gotConvert, gotDLL := shouldConvertExecuteShellcodePE(tc.path, tc.flagsChanged)
|
|
if gotConvert != tc.wantConvert || gotDLL != tc.wantDLL {
|
|
t.Fatalf("unexpected result convert=%v dll=%v, expected convert=%v dll=%v", gotConvert, gotDLL, tc.wantConvert, tc.wantDLL)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func newExecuteShellcodeFlagsTestCommand(t *testing.T) *cobra.Command {
|
|
t.Helper()
|
|
|
|
cmd := &cobra.Command{Use: "execute-shellcode"}
|
|
cmd.Flags().Uint32("shellcode-entropy", 1, "")
|
|
cmd.Flags().Bool("shellcode-compress", false, "")
|
|
cmd.Flags().Uint32("shellcode-exitopt", 1, "")
|
|
cmd.Flags().Uint32("shellcode-bypass", 3, "")
|
|
cmd.Flags().Uint32("shellcode-headers", 1, "")
|
|
cmd.Flags().Bool("shellcode-thread", false, "")
|
|
cmd.Flags().Bool("shellcode-unicode", false, "")
|
|
cmd.Flags().Uint32("shellcode-oep", 0, "")
|
|
return cmd
|
|
}
|