-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
110 lines (86 loc) · 1.78 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package main
import (
"debug/elf"
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
"github.com/u-root/u-root/pkg/ldd"
)
func check(e error) {
if e != nil {
log.Fatalf("%s", e)
}
}
var (
ELFFile *elf.File
ELFFilePath string
)
func main() {
var err error
// check os args
if len(os.Args) != 3 {
err = fmt.Errorf("please use like as " + os.Args[0] + " /bin/bash /target")
}
check(err)
ELFFilePath = os.Args[1]
// Open binnary
f, err := os.Open(ELFFilePath)
check(err)
// ELF file underlying reader
ELFFile, err = elf.NewFile(f)
check(err)
// Read and decode ELF identifier
var ident [16]uint8
f.ReadAt(ident[0:], 0)
check(err)
if ident[0] != '\x7f' || ident[1] != 'E' || ident[2] != 'L' || ident[3] != 'F' {
err = fmt.Errorf("Bad magic number at %d\n", ident[0:4])
}
check(err)
log.Printf("Class: %s\n", ELFFile.Class.String())
log.Printf("Machine: %s\n", ELFFile.Machine.String())
list, err := ldd.Ldd([]string{os.Args[1]})
for i := range list {
targetFile := os.Args[2] + list[i].FullName
targetFile = strings.Replace(targetFile, "//", "/", -1)
log.Printf("file %s is copied to %s\n", list[i].FullName, targetFile)
check(os.MkdirAll(filepath.Dir(targetFile), os.ModePerm))
check(cp(list[i].FullName, targetFile))
}
}
func cp(src, dst string) (err error) {
srcFile, err := os.Open(src)
if err != nil {
return
}
defer srcFile.Close()
dstFile, err := os.Create(dst)
if err != nil {
return
}
defer func() {
if e := dstFile.Close(); e != nil {
err = e
}
}()
_, err = io.Copy(dstFile, srcFile)
if err != nil {
return err
}
err = dstFile.Sync()
if err != nil {
return err
}
srcStat, err := os.Stat(src)
if err != nil {
return err
}
err = os.Chmod(dst, srcStat.Mode())
if err != nil {
return err
}
return
}