1 |
commit: bc9b1d5b70b43ea2b7822e1580a2bd8b9839e36f |
2 |
Author: Anthony G. Basile <basile <AT> opensource <DOT> dyc <DOT> edu> |
3 |
AuthorDate: Sat May 7 01:44:26 2011 +0000 |
4 |
Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org> |
5 |
CommitDate: Sat May 7 01:44:26 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/elfix.git;a=commit;h=bc9b1d5b |
7 |
|
8 |
poc/mangle-paxflags.c: added verbose mode |
9 |
|
10 |
--- |
11 |
poc/mangle-paxflags.c | 134 +++++++++++++++++++++++++++++++------------------ |
12 |
1 files changed, 85 insertions(+), 49 deletions(-) |
13 |
|
14 |
diff --git a/poc/mangle-paxflags.c b/poc/mangle-paxflags.c |
15 |
index 8e2607c..530411c 100644 |
16 |
--- a/poc/mangle-paxflags.c |
17 |
+++ b/poc/mangle-paxflags.c |
18 |
@@ -39,8 +39,10 @@ |
19 |
#define HF_PAX_RANDEXEC 16 // 1: Randomize ET_EXEC base |
20 |
#define HF_PAX_SEGMEXEC 32 // 0: Segmentation based non-exec pages |
21 |
|
22 |
-#define PRINT(E,F,I) printf("%s:\t%s\n", #E, E & F ? ( I ? "enabled" : "disabled" ) : ( I ? "disabled" : "enabled" ) ); |
23 |
-#define CASE(N,P) case P: printf("%d: %s\n", (int)N, #P); break |
24 |
+#define PRINT(E,F,I) printf("%s:\t%s\n", #E, E&F? (I? "enabled" : "disabled") : (I? "disabled" : "enabled")); |
25 |
+#define SPRINT(E,F,A,B) printf("%c", E&F? A : B); |
26 |
+#define CPRINT(N,P) case P: printf("%d: %s\n", (int)N, #P); break |
27 |
+#define FPRINT(N,D,F,A,B) printf("%c", N&F? (D&F? '*' : B) : (D&F? A : '-')) |
28 |
|
29 |
|
30 |
void |
31 |
@@ -54,6 +56,7 @@ print_help(char *v) |
32 |
"options : Print out EI_PAX and PT_PAX_FLAGS information\n" |
33 |
" : -e Set all EI_PAX flags to least secure setting, pEmrXs\n" |
34 |
" : -p Remove PT_PAX_FLAGS program header\n" |
35 |
+ " : -v Verbose expanation of flags (rather than short list)\n" |
36 |
" : -h Print out this help\n", |
37 |
v |
38 |
); |
39 |
@@ -63,16 +66,18 @@ print_help(char *v) |
40 |
|
41 |
|
42 |
char * |
43 |
-parse_cmd_args( int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags ) |
44 |
+parse_cmd_args(int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags, int *verbose) |
45 |
{ |
46 |
int i, oc; |
47 |
|
48 |
if((c != 2)&&(c != 3)&&(c != 4)) |
49 |
- error(EXIT_FAILURE, 0, "Usage: %s {[-e] [-p] ELFfile | [-h]}", v[0]); |
50 |
+ error(EXIT_FAILURE, 0, "Usage: %s {[-e] [-p] [-v] ELFfile | [-h]}", v[0]); |
51 |
|
52 |
*flag_ei_pax = 0; |
53 |
*flag_pt_pax_flags = 0; |
54 |
- while((oc = getopt(c, v,":eph")) != -1) |
55 |
+ *verbose = 0; |
56 |
+ |
57 |
+ while((oc = getopt(c, v,":epvh")) != -1) |
58 |
switch(oc) |
59 |
{ |
60 |
case 'e': |
61 |
@@ -81,6 +86,9 @@ parse_cmd_args( int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags ) |
62 |
case 'p': |
63 |
*flag_pt_pax_flags = 1; |
64 |
break; |
65 |
+ case 'v': |
66 |
+ *verbose = 1; |
67 |
+ break; |
68 |
case 'h': |
69 |
print_help(v[0]); |
70 |
break; |
71 |
@@ -96,8 +104,7 @@ parse_cmd_args( int c, char *v[], int *flag_ei_pax, int *flag_pt_pax_flags ) |
72 |
int |
73 |
main( int argc, char *argv[]) |
74 |
{ |
75 |
- int fd; |
76 |
- int flag_ei_pax, flag_pt_pax_flags, found_ei_pax; |
77 |
+ int fd, flag_ei_pax, flag_pt_pax_flags, verbose, found_ei_pax; |
78 |
char *f_name; |
79 |
size_t i, phnum; |
80 |
|
81 |
@@ -105,7 +112,7 @@ main( int argc, char *argv[]) |
82 |
GElf_Ehdr ehdr; |
83 |
GElf_Phdr phdr; |
84 |
|
85 |
- f_name = parse_cmd_args(argc, argv, &flag_ei_pax, &flag_pt_pax_flags); |
86 |
+ f_name = parse_cmd_args(argc, argv, &flag_ei_pax, &flag_pt_pax_flags, &verbose); |
87 |
|
88 |
if(elf_version(EV_CURRENT) == EV_NONE) |
89 |
error(EXIT_FAILURE, 0, "Library out of date."); |
90 |
@@ -134,13 +141,26 @@ main( int argc, char *argv[]) |
91 |
found_ei_pax = ((u_long) ehdr.e_ident[EI_PAX + 1] << 8) + (u_long) ehdr.e_ident[EI_PAX]; |
92 |
|
93 |
printf("==== EI_PAX ====\n") ; |
94 |
- PRINT(HF_PAX_PAGEEXEC, found_ei_pax, 0); |
95 |
- PRINT(HF_PAX_EMUTRAMP, found_ei_pax, 1); |
96 |
- PRINT(HF_PAX_MPROTECT, found_ei_pax, 0); |
97 |
- PRINT(HF_PAX_RANDMMAP, found_ei_pax, 0); |
98 |
- PRINT(HF_PAX_RANDEXEC, found_ei_pax, 1); |
99 |
- PRINT(HF_PAX_SEGMEXEC, found_ei_pax, 0); |
100 |
- printf("\n"); |
101 |
+ if(verbose) |
102 |
+ { |
103 |
+ PRINT(HF_PAX_PAGEEXEC, found_ei_pax, 0); |
104 |
+ PRINT(HF_PAX_EMUTRAMP, found_ei_pax, 1); |
105 |
+ PRINT(HF_PAX_MPROTECT, found_ei_pax, 0); |
106 |
+ PRINT(HF_PAX_RANDMMAP, found_ei_pax, 0); |
107 |
+ PRINT(HF_PAX_RANDEXEC, found_ei_pax, 1); |
108 |
+ PRINT(HF_PAX_SEGMEXEC, found_ei_pax, 0); |
109 |
+ printf("\n"); |
110 |
+ } |
111 |
+ else |
112 |
+ { |
113 |
+ SPRINT(HF_PAX_PAGEEXEC, found_ei_pax, 'p', 'P'); |
114 |
+ SPRINT(HF_PAX_EMUTRAMP, found_ei_pax, 'E', 'e'); |
115 |
+ SPRINT(HF_PAX_MPROTECT, found_ei_pax, 'm', 'M'); |
116 |
+ SPRINT(HF_PAX_RANDMMAP, found_ei_pax, 'r', 'R'); |
117 |
+ SPRINT(HF_PAX_RANDEXEC, found_ei_pax, 'X', 'x'); |
118 |
+ SPRINT(HF_PAX_SEGMEXEC, found_ei_pax, 's', 'S'); |
119 |
+ printf("\n\n"); |
120 |
+ } |
121 |
|
122 |
if( flag_ei_pax ) |
123 |
{ |
124 |
@@ -158,45 +178,61 @@ main( int argc, char *argv[]) |
125 |
if(gelf_getphdr(elf, i, &phdr) != &phdr) |
126 |
error(EXIT_FAILURE, 0, "gelf_getphdr(): %s", elf_errmsg(elf_errno())); |
127 |
|
128 |
- switch(phdr.p_type) |
129 |
+ if(verbose) |
130 |
{ |
131 |
- CASE(i,PT_NULL); |
132 |
- CASE(i,PT_LOAD); |
133 |
- CASE(i,PT_DYNAMIC); |
134 |
- CASE(i,PT_INTERP); |
135 |
- CASE(i,PT_NOTE); |
136 |
- CASE(i,PT_SHLIB); |
137 |
- CASE(i,PT_PHDR); |
138 |
- CASE(i,PT_TLS); |
139 |
- CASE(i,PT_NUM); |
140 |
- CASE(i,PT_LOOS); |
141 |
- CASE(i,PT_GNU_EH_FRAME); |
142 |
- CASE(i,PT_GNU_STACK); |
143 |
- CASE(i,PT_GNU_RELRO); |
144 |
- CASE(i,PT_PAX_FLAGS); |
145 |
- CASE(i,PT_LOSUNW); |
146 |
- //CASE(i,PT_SUNWBSS); |
147 |
- CASE(i,PT_SUNWSTACK); |
148 |
- CASE(i,PT_HISUNW); |
149 |
- //CASE(i,PT_HIOS); |
150 |
- CASE(i,PT_LOPROC); |
151 |
- CASE(i,PT_HIPROC); |
152 |
+ switch(phdr.p_type) |
153 |
+ { |
154 |
+ CPRINT(i,PT_NULL); |
155 |
+ CPRINT(i,PT_LOAD); |
156 |
+ CPRINT(i,PT_DYNAMIC); |
157 |
+ CPRINT(i,PT_INTERP); |
158 |
+ CPRINT(i,PT_NOTE); |
159 |
+ CPRINT(i,PT_SHLIB); |
160 |
+ CPRINT(i,PT_PHDR); |
161 |
+ CPRINT(i,PT_TLS); |
162 |
+ CPRINT(i,PT_NUM); |
163 |
+ CPRINT(i,PT_LOOS); |
164 |
+ CPRINT(i,PT_GNU_EH_FRAME); |
165 |
+ CPRINT(i,PT_GNU_STACK); |
166 |
+ CPRINT(i,PT_GNU_RELRO); |
167 |
+ CPRINT(i,PT_PAX_FLAGS); |
168 |
+ CPRINT(i,PT_LOSUNW); |
169 |
+ //CPRINT(i,PT_SUNWBSS); |
170 |
+ CPRINT(i,PT_SUNWSTACK); |
171 |
+ CPRINT(i,PT_HISUNW); |
172 |
+ //CPRINT(i,PT_HIOS); |
173 |
+ CPRINT(i,PT_LOPROC); |
174 |
+ CPRINT(i,PT_HIPROC); |
175 |
+ } |
176 |
} |
177 |
|
178 |
if(phdr.p_type == PT_PAX_FLAGS) |
179 |
{ |
180 |
- PRINT(PF_PAGEEXEC, phdr.p_flags, 1); |
181 |
- PRINT(PF_NOPAGEEXEC, phdr.p_flags, 1); |
182 |
- PRINT(PF_SEGMEXEC, phdr.p_flags, 1); |
183 |
- PRINT(PF_NOSEGMEXEC, phdr.p_flags, 1); |
184 |
- PRINT(PF_MPROTECT, phdr.p_flags, 1); |
185 |
- PRINT(PF_NOMPROTECT, phdr.p_flags, 1); |
186 |
- PRINT(PF_RANDEXEC, phdr.p_flags, 1); |
187 |
- PRINT(PF_NORANDEXEC, phdr.p_flags, 1); |
188 |
- PRINT(PF_EMUTRAMP, phdr.p_flags, 1); |
189 |
- PRINT(PF_NOEMUTRAMP, phdr.p_flags, 1); |
190 |
- PRINT(PF_RANDMMAP, phdr.p_flags, 1); |
191 |
- PRINT(PF_NORANDMMAP, phdr.p_flags, 1); |
192 |
+ if(verbose) |
193 |
+ { |
194 |
+ PRINT(PF_PAGEEXEC, phdr.p_flags, 1); |
195 |
+ PRINT(PF_NOPAGEEXEC, phdr.p_flags, 1); |
196 |
+ PRINT(PF_SEGMEXEC, phdr.p_flags, 1); |
197 |
+ PRINT(PF_NOSEGMEXEC, phdr.p_flags, 1); |
198 |
+ PRINT(PF_MPROTECT, phdr.p_flags, 1); |
199 |
+ PRINT(PF_NOMPROTECT, phdr.p_flags, 1); |
200 |
+ PRINT(PF_RANDEXEC, phdr.p_flags, 1); |
201 |
+ PRINT(PF_NORANDEXEC, phdr.p_flags, 1); |
202 |
+ PRINT(PF_EMUTRAMP, phdr.p_flags, 1); |
203 |
+ PRINT(PF_NOEMUTRAMP, phdr.p_flags, 1); |
204 |
+ PRINT(PF_RANDMMAP, phdr.p_flags, 1); |
205 |
+ PRINT(PF_NORANDMMAP, phdr.p_flags, 1); |
206 |
+ } |
207 |
+ else |
208 |
+ { |
209 |
+ printf("%d: PT_PAX_FLAGS\n", (int)i); |
210 |
+ FPRINT(PF_PAGEEXEC, PF_NOPAGEEXEC, phdr.p_flags, 'p', 'P'); |
211 |
+ FPRINT(PF_EMUTRAMP, PF_NOEMUTRAMP, phdr.p_flags, 'e', 'E'); |
212 |
+ FPRINT(PF_MPROTECT, PF_NOMPROTECT, phdr.p_flags, 'm', 'M'); |
213 |
+ FPRINT(PF_RANDMMAP, PF_NORANDMMAP, phdr.p_flags, 'r', 'R'); |
214 |
+ FPRINT(PF_RANDEXEC, PF_NORANDEXEC, phdr.p_flags, 'x', 'X'); |
215 |
+ FPRINT(PF_SEGMEXEC, PF_NOSEGMEXEC, phdr.p_flags, 's', 'S'); |
216 |
+ } |
217 |
} |
218 |
|
219 |
if((phdr.p_type == PT_PAX_FLAGS) && flag_pt_pax_flags ) |