func setupElfAuxv(u models.Usercorn) ([]Elf64Auxv, error) { // set up AT_RANDOM var tmp [16]byte if _, err := rand.Read(tmp[:]); err != nil { return nil, err } randAddr, err := u.PushBytes(tmp[:]) if err != nil { return nil, err } // insert platform string platformAddr, err := u.PushBytes([]byte(u.Loader().Arch() + "\x00")) if err != nil { return nil, err } // main auxv table auxv := []Elf64Auxv{ // TODO: set/track a page size somewhere - on Arch.OS? {ELF_AT_PAGESZ, 4096}, {ELF_AT_BASE, u.InterpBase()}, {ELF_AT_FLAGS, 0}, {ELF_AT_ENTRY, uint64(u.BinEntry())}, {ELF_AT_UID, uint64(os.Getuid())}, {ELF_AT_EUID, uint64(os.Geteuid())}, {ELF_AT_GID, uint64(os.Getgid())}, {ELF_AT_EGID, uint64(os.Getegid())}, {ELF_AT_PLATFORM, platformAddr}, {ELF_AT_CLKTCK, 100}, // 100hz, totally fake {ELF_AT_RANDOM, randAddr}, {ELF_AT_NULL, 0}, } // add phdr information if present in binary phdrOff, _, phdrCount := u.Loader().Header() segments, _ := u.Loader().Segments() for _, s := range segments { if s.ContainsPhys(phdrOff) { phdrOff += s.Addr break } } phdrEnt := 56 if u.Bits() == 32 { phdrEnt = 56 // FIXME } if phdrOff > 0 { auxv = append(auxv, []Elf64Auxv{ {ELF_AT_PHDR, phdrOff}, {ELF_AT_PHENT, uint64(phdrEnt)}, {ELF_AT_PHNUM, uint64(phdrCount)}, }...) } return auxv, nil }