Gentoo Archives: gentoo-commits

From: "Anthony G. Basile" <blueness@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/elfix:master commit in: poc/
Date: Sat, 07 May 2011 01:44:43
Message-Id: bc9b1d5b70b43ea2b7822e1580a2bd8b9839e36f.blueness@gentoo
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 )