Slide 18
Slide 18 text
func patch(path string, setStackSize bool, stackSize uint64) (uint64, error)
switch fh.Class {
case elf.ELFCLASS32:
eh := &elf.Header32{}
if err := binary.Read(f, fh.ByteOrder, eh); err != nil {
return 0, err
}
phoff := int64(eh.Phoff)
phentsize := int64(eh.Phentsize)
phnum := int(eh.Phnum)
for i := 0; i < phnum; i++ {
off := phoff + int64(i)*phentsize
f.Seek(off, io.SeekStart)
ph := &elf.Prog32{}
if err := binary.Read(f, fh.ByteOrder, ph); err != nil {
return 0, err
}
if ph.Type == ptGnuStack {
if setStackSize {
ph.Memsz = uint32(stackSize)
f.Seek(off, io.SeekStart)
if err := binary.Write(f, fh.ByteOrder, ph); err != nil {
return 0, err
}
}
return uint64(ph.Memsz), nil
}
}
https://github.com/yaegashi/muslstack/blob/master/main.go