本文整理汇总了Golang中github.com/lunixbochs/usercorn/go/models.Usercorn.InterpBase方法的典型用法代码示例。如果您正苦于以下问题:Golang Usercorn.InterpBase方法的具体用法?Golang Usercorn.InterpBase怎么用?Golang Usercorn.InterpBase使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/lunixbochs/usercorn/go/models.Usercorn
的用法示例。
在下文中一共展示了Usercorn.InterpBase方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: setupElfAuxv
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
}