1*9a0e4156SSadaf Ebrahimi /* Capstone testing regression */
2*9a0e4156SSadaf Ebrahimi /* By Do Minh Tuan <[email protected]>, 02-2019 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi
5*9a0e4156SSadaf Ebrahimi #include "helper.h"
6*9a0e4156SSadaf Ebrahimi
split(char * str,char * delim,int * size)7*9a0e4156SSadaf Ebrahimi char **split(char *str, char *delim, int *size)
8*9a0e4156SSadaf Ebrahimi {
9*9a0e4156SSadaf Ebrahimi char **result;
10*9a0e4156SSadaf Ebrahimi char *token, *src;
11*9a0e4156SSadaf Ebrahimi int cnt;
12*9a0e4156SSadaf Ebrahimi
13*9a0e4156SSadaf Ebrahimi cnt = 0;
14*9a0e4156SSadaf Ebrahimi src = str;
15*9a0e4156SSadaf Ebrahimi result = NULL;
16*9a0e4156SSadaf Ebrahimi
17*9a0e4156SSadaf Ebrahimi while ((token = strstr(src, delim)) != NULL) {
18*9a0e4156SSadaf Ebrahimi result = (char **)realloc(result, sizeof(char *) * (cnt + 1));
19*9a0e4156SSadaf Ebrahimi result[cnt] = (char *)calloc(1, sizeof(char) * (int)(token - src + 10));
20*9a0e4156SSadaf Ebrahimi memcpy(result[cnt], src, token - src);
21*9a0e4156SSadaf Ebrahimi result[cnt][token - src] = '\0';
22*9a0e4156SSadaf Ebrahimi src = token + strlen(delim);
23*9a0e4156SSadaf Ebrahimi cnt ++;
24*9a0e4156SSadaf Ebrahimi }
25*9a0e4156SSadaf Ebrahimi
26*9a0e4156SSadaf Ebrahimi if (strlen(src) > 0) {
27*9a0e4156SSadaf Ebrahimi result = (char **)realloc(result, sizeof(char *) * (cnt + 1));
28*9a0e4156SSadaf Ebrahimi result[cnt] = strdup(src);
29*9a0e4156SSadaf Ebrahimi cnt ++;
30*9a0e4156SSadaf Ebrahimi }
31*9a0e4156SSadaf Ebrahimi
32*9a0e4156SSadaf Ebrahimi *size = cnt;
33*9a0e4156SSadaf Ebrahimi return result;
34*9a0e4156SSadaf Ebrahimi }
35*9a0e4156SSadaf Ebrahimi
print_strs(char ** list_str,int size)36*9a0e4156SSadaf Ebrahimi void print_strs(char **list_str, int size)
37*9a0e4156SSadaf Ebrahimi {
38*9a0e4156SSadaf Ebrahimi int i;
39*9a0e4156SSadaf Ebrahimi
40*9a0e4156SSadaf Ebrahimi printf("[+] Debug %d strings:\n", size);
41*9a0e4156SSadaf Ebrahimi for (i = 0; i < size; ++i)
42*9a0e4156SSadaf Ebrahimi printf("String %d'th: %s\n", i+1, list_str[i]);
43*9a0e4156SSadaf Ebrahimi }
44*9a0e4156SSadaf Ebrahimi
free_strs(char ** list_str,int size)45*9a0e4156SSadaf Ebrahimi void free_strs(char **list_str, int size)
46*9a0e4156SSadaf Ebrahimi {
47*9a0e4156SSadaf Ebrahimi int i;
48*9a0e4156SSadaf Ebrahimi for (i = 0; i < size; ++i)
49*9a0e4156SSadaf Ebrahimi free(list_str[i]);
50*9a0e4156SSadaf Ebrahimi
51*9a0e4156SSadaf Ebrahimi free(list_str);
52*9a0e4156SSadaf Ebrahimi }
53*9a0e4156SSadaf Ebrahimi
get_filename_ext(const char * filename)54*9a0e4156SSadaf Ebrahimi const char *get_filename_ext(const char *filename)
55*9a0e4156SSadaf Ebrahimi {
56*9a0e4156SSadaf Ebrahimi const char *dot;
57*9a0e4156SSadaf Ebrahimi
58*9a0e4156SSadaf Ebrahimi dot = strrchr(filename, '.');
59*9a0e4156SSadaf Ebrahimi if (!dot || dot == filename)
60*9a0e4156SSadaf Ebrahimi return "";
61*9a0e4156SSadaf Ebrahimi
62*9a0e4156SSadaf Ebrahimi return dot + 1;
63*9a0e4156SSadaf Ebrahimi }
64*9a0e4156SSadaf Ebrahimi
readfile(const char * filename)65*9a0e4156SSadaf Ebrahimi char *readfile(const char *filename)
66*9a0e4156SSadaf Ebrahimi {
67*9a0e4156SSadaf Ebrahimi char *result;
68*9a0e4156SSadaf Ebrahimi FILE *fp;
69*9a0e4156SSadaf Ebrahimi int size;
70*9a0e4156SSadaf Ebrahimi
71*9a0e4156SSadaf Ebrahimi fp = fopen(filename, "r");
72*9a0e4156SSadaf Ebrahimi if (fp == NULL) {
73*9a0e4156SSadaf Ebrahimi puts("No such file");
74*9a0e4156SSadaf Ebrahimi exit(-1);
75*9a0e4156SSadaf Ebrahimi }
76*9a0e4156SSadaf Ebrahimi
77*9a0e4156SSadaf Ebrahimi fseek(fp, 0, SEEK_END);
78*9a0e4156SSadaf Ebrahimi size = ftell(fp);
79*9a0e4156SSadaf Ebrahimi rewind(fp);
80*9a0e4156SSadaf Ebrahimi
81*9a0e4156SSadaf Ebrahimi result = (char *)calloc(1, sizeof(char) * size + 1);
82*9a0e4156SSadaf Ebrahimi fread(result, size, 1, fp);
83*9a0e4156SSadaf Ebrahimi result[size] = '\0';
84*9a0e4156SSadaf Ebrahimi
85*9a0e4156SSadaf Ebrahimi fclose(fp);
86*9a0e4156SSadaf Ebrahimi return result;
87*9a0e4156SSadaf Ebrahimi }
88*9a0e4156SSadaf Ebrahimi
add_str(char ** src,const char * format,...)89*9a0e4156SSadaf Ebrahimi void add_str(char **src, const char *format, ...)
90*9a0e4156SSadaf Ebrahimi {
91*9a0e4156SSadaf Ebrahimi char *tmp;
92*9a0e4156SSadaf Ebrahimi size_t len1, len2;
93*9a0e4156SSadaf Ebrahimi va_list args;
94*9a0e4156SSadaf Ebrahimi
95*9a0e4156SSadaf Ebrahimi tmp = (char *)malloc(sizeof(char) * 1000);
96*9a0e4156SSadaf Ebrahimi va_start(args, format);
97*9a0e4156SSadaf Ebrahimi vsprintf(tmp, format, args);
98*9a0e4156SSadaf Ebrahimi va_end(args);
99*9a0e4156SSadaf Ebrahimi
100*9a0e4156SSadaf Ebrahimi len1 = strlen(*src);
101*9a0e4156SSadaf Ebrahimi len2 = strlen(tmp);
102*9a0e4156SSadaf Ebrahimi
103*9a0e4156SSadaf Ebrahimi *src = (char *)realloc(*src, sizeof(char) * (len1 + len2 + 10));
104*9a0e4156SSadaf Ebrahimi memcpy(*src + len1, tmp, len2 + 1);
105*9a0e4156SSadaf Ebrahimi free(tmp);
106*9a0e4156SSadaf Ebrahimi }
107*9a0e4156SSadaf Ebrahimi
replace_hex(char * src)108*9a0e4156SSadaf Ebrahimi void replace_hex(char *src)
109*9a0e4156SSadaf Ebrahimi {
110*9a0e4156SSadaf Ebrahimi char *tmp, *result, *found, *origin, *orig_found;
111*9a0e4156SSadaf Ebrahimi int i, valid;
112*9a0e4156SSadaf Ebrahimi unsigned long long int value;
113*9a0e4156SSadaf Ebrahimi char *tmp_tmp;
114*9a0e4156SSadaf Ebrahimi
115*9a0e4156SSadaf Ebrahimi result = (char *)malloc(sizeof(char));
116*9a0e4156SSadaf Ebrahimi result[0] = '\0';
117*9a0e4156SSadaf Ebrahimi tmp = strdup(src);
118*9a0e4156SSadaf Ebrahimi origin = tmp;
119*9a0e4156SSadaf Ebrahimi
120*9a0e4156SSadaf Ebrahimi while ((found = strstr(tmp, "0x")) != NULL) {
121*9a0e4156SSadaf Ebrahimi orig_found = found;
122*9a0e4156SSadaf Ebrahimi found += 2;
123*9a0e4156SSadaf Ebrahimi value = 0;
124*9a0e4156SSadaf Ebrahimi valid = 0;
125*9a0e4156SSadaf Ebrahimi
126*9a0e4156SSadaf Ebrahimi tmp_tmp = strndup(tmp, orig_found - tmp);
127*9a0e4156SSadaf Ebrahimi while (*found != '\0' && isxdigit(*found)) {
128*9a0e4156SSadaf Ebrahimi valid = 1;
129*9a0e4156SSadaf Ebrahimi if (*found >= 'a' && *found <='f')
130*9a0e4156SSadaf Ebrahimi value = value*0x10 + (*found - 'a' + 10);
131*9a0e4156SSadaf Ebrahimi else
132*9a0e4156SSadaf Ebrahimi value = value*0x10 + (*found - '0');
133*9a0e4156SSadaf Ebrahimi found++;
134*9a0e4156SSadaf Ebrahimi }
135*9a0e4156SSadaf Ebrahimi
136*9a0e4156SSadaf Ebrahimi if (valid == 1) add_str(&result, "%s%llu", tmp_tmp, value);
137*9a0e4156SSadaf Ebrahimi else add_str(&result, "%s0x", tmp_tmp);
138*9a0e4156SSadaf Ebrahimi tmp = found;
139*9a0e4156SSadaf Ebrahimi free(tmp_tmp);
140*9a0e4156SSadaf Ebrahimi }
141*9a0e4156SSadaf Ebrahimi
142*9a0e4156SSadaf Ebrahimi add_str(&result, "%s", tmp);
143*9a0e4156SSadaf Ebrahimi if (strlen(result) >= MAXMEM) {
144*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ Error ] --- Buffer Overflow in replace_hex()\n");
145*9a0e4156SSadaf Ebrahimi free(result);
146*9a0e4156SSadaf Ebrahimi free(origin);
147*9a0e4156SSadaf Ebrahimi _fail(__FILE__, __LINE__);
148*9a0e4156SSadaf Ebrahimi }
149*9a0e4156SSadaf Ebrahimi
150*9a0e4156SSadaf Ebrahimi strcpy(src, result);
151*9a0e4156SSadaf Ebrahimi free(result);
152*9a0e4156SSadaf Ebrahimi free(origin);
153*9a0e4156SSadaf Ebrahimi }
154*9a0e4156SSadaf Ebrahimi
replace_negative(char * src,int mode)155*9a0e4156SSadaf Ebrahimi void replace_negative(char *src, int mode)
156*9a0e4156SSadaf Ebrahimi {
157*9a0e4156SSadaf Ebrahimi char *tmp, *result, *found, *origin, *orig_found;
158*9a0e4156SSadaf Ebrahimi int i, cnt, valid;
159*9a0e4156SSadaf Ebrahimi char *value, *tmp_tmp;
160*9a0e4156SSadaf Ebrahimi unsigned short int tmp_short;
161*9a0e4156SSadaf Ebrahimi unsigned int tmp_int;
162*9a0e4156SSadaf Ebrahimi unsigned long int tmp_long;
163*9a0e4156SSadaf Ebrahimi
164*9a0e4156SSadaf Ebrahimi result = (char *)malloc(sizeof(char));
165*9a0e4156SSadaf Ebrahimi result[0] = '\0';
166*9a0e4156SSadaf Ebrahimi tmp = strdup(src);
167*9a0e4156SSadaf Ebrahimi origin = tmp;
168*9a0e4156SSadaf Ebrahimi
169*9a0e4156SSadaf Ebrahimi while ((found = strstr(tmp, "-")) != NULL) {
170*9a0e4156SSadaf Ebrahimi orig_found = found;
171*9a0e4156SSadaf Ebrahimi found ++;
172*9a0e4156SSadaf Ebrahimi valid = 0;
173*9a0e4156SSadaf Ebrahimi
174*9a0e4156SSadaf Ebrahimi value = strdup("-");
175*9a0e4156SSadaf Ebrahimi cnt = 2;
176*9a0e4156SSadaf Ebrahimi
177*9a0e4156SSadaf Ebrahimi while (*found != '\0' && isdigit(*found)) {
178*9a0e4156SSadaf Ebrahimi valid = 1;
179*9a0e4156SSadaf Ebrahimi value = (char *)realloc(value, cnt + 1);
180*9a0e4156SSadaf Ebrahimi value[cnt - 1] = *found;
181*9a0e4156SSadaf Ebrahimi value[cnt] = '\0';
182*9a0e4156SSadaf Ebrahimi cnt ++;
183*9a0e4156SSadaf Ebrahimi found++;
184*9a0e4156SSadaf Ebrahimi }
185*9a0e4156SSadaf Ebrahimi
186*9a0e4156SSadaf Ebrahimi tmp_tmp = strndup(tmp, orig_found - tmp);
187*9a0e4156SSadaf Ebrahimi if (valid == 1) {
188*9a0e4156SSadaf Ebrahimi *orig_found = '\0';
189*9a0e4156SSadaf Ebrahimi if (mode == X86_16) {
190*9a0e4156SSadaf Ebrahimi sscanf(value, "%hu", &tmp_short);
191*9a0e4156SSadaf Ebrahimi add_str(&result, "%s%hu", tmp_tmp, tmp_short);
192*9a0e4156SSadaf Ebrahimi } else if (mode == X86_32) {
193*9a0e4156SSadaf Ebrahimi sscanf(value, "%u", &tmp_int);
194*9a0e4156SSadaf Ebrahimi add_str(&result, "%s%u", tmp_tmp, tmp_int);
195*9a0e4156SSadaf Ebrahimi } else if (mode == X86_64) {
196*9a0e4156SSadaf Ebrahimi sscanf(value, "%lu", &tmp_long);
197*9a0e4156SSadaf Ebrahimi add_str(&result, "%s%lu", tmp_tmp, tmp_long);
198*9a0e4156SSadaf Ebrahimi }
199*9a0e4156SSadaf Ebrahimi }
200*9a0e4156SSadaf Ebrahimi else add_str(&result, "%s-", tmp_tmp);
201*9a0e4156SSadaf Ebrahimi
202*9a0e4156SSadaf Ebrahimi tmp = found;
203*9a0e4156SSadaf Ebrahimi free(value);
204*9a0e4156SSadaf Ebrahimi free(tmp_tmp);
205*9a0e4156SSadaf Ebrahimi }
206*9a0e4156SSadaf Ebrahimi
207*9a0e4156SSadaf Ebrahimi add_str(&result, "%s", tmp);
208*9a0e4156SSadaf Ebrahimi if (strlen(result) >= MAXMEM) {
209*9a0e4156SSadaf Ebrahimi fprintf(stderr, "[ Error ] --- Buffer Overflow in replace_negative()\n");
210*9a0e4156SSadaf Ebrahimi free(result);
211*9a0e4156SSadaf Ebrahimi free(origin);
212*9a0e4156SSadaf Ebrahimi _fail(__FILE__, __LINE__);
213*9a0e4156SSadaf Ebrahimi }
214*9a0e4156SSadaf Ebrahimi
215*9a0e4156SSadaf Ebrahimi strcpy(src, result);
216*9a0e4156SSadaf Ebrahimi free(result);
217*9a0e4156SSadaf Ebrahimi free(origin);
218*9a0e4156SSadaf Ebrahimi }
219*9a0e4156SSadaf Ebrahimi
listdir(const char * name,char *** files,int * num_files)220*9a0e4156SSadaf Ebrahimi void listdir(const char *name, char ***files, int *num_files)
221*9a0e4156SSadaf Ebrahimi {
222*9a0e4156SSadaf Ebrahimi DIR *dir;
223*9a0e4156SSadaf Ebrahimi struct dirent *entry;
224*9a0e4156SSadaf Ebrahimi int cnt;
225*9a0e4156SSadaf Ebrahimi
226*9a0e4156SSadaf Ebrahimi if (!(dir = opendir(name)))
227*9a0e4156SSadaf Ebrahimi return;
228*9a0e4156SSadaf Ebrahimi
229*9a0e4156SSadaf Ebrahimi while ((entry = readdir(dir)) != NULL) {
230*9a0e4156SSadaf Ebrahimi if (entry->d_type == DT_DIR) {
231*9a0e4156SSadaf Ebrahimi char path[1024];
232*9a0e4156SSadaf Ebrahimi if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
233*9a0e4156SSadaf Ebrahimi continue;
234*9a0e4156SSadaf Ebrahimi snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
235*9a0e4156SSadaf Ebrahimi listdir(path, files, num_files);
236*9a0e4156SSadaf Ebrahimi } else {
237*9a0e4156SSadaf Ebrahimi cnt = *num_files;
238*9a0e4156SSadaf Ebrahimi *files = (char **)realloc(*files, sizeof(char *) * (cnt + 1));
239*9a0e4156SSadaf Ebrahimi (*files)[cnt] = (char *)malloc(sizeof(char) * ( strlen(name) + 1 + strlen(entry->d_name) + 10));
240*9a0e4156SSadaf Ebrahimi sprintf((*files)[cnt], "%s/%s", name, entry->d_name);
241*9a0e4156SSadaf Ebrahimi cnt ++;
242*9a0e4156SSadaf Ebrahimi *num_files = cnt;
243*9a0e4156SSadaf Ebrahimi }
244*9a0e4156SSadaf Ebrahimi }
245*9a0e4156SSadaf Ebrahimi
246*9a0e4156SSadaf Ebrahimi closedir(dir);
247*9a0e4156SSadaf Ebrahimi }
248*9a0e4156SSadaf Ebrahimi
trim_str(char * str)249*9a0e4156SSadaf Ebrahimi void trim_str(char *str)
250*9a0e4156SSadaf Ebrahimi {
251*9a0e4156SSadaf Ebrahimi char tmp[MAXMEM];
252*9a0e4156SSadaf Ebrahimi int start, end, j, i;
253*9a0e4156SSadaf Ebrahimi
254*9a0e4156SSadaf Ebrahimi start = 0;
255*9a0e4156SSadaf Ebrahimi end = strlen(str) - 1;
256*9a0e4156SSadaf Ebrahimi j = 0;
257*9a0e4156SSadaf Ebrahimi while (start < strlen(str) && isspace(str[start])) start++;
258*9a0e4156SSadaf Ebrahimi while (end >= 0 && isspace(str[end])) end--;
259*9a0e4156SSadaf Ebrahimi
260*9a0e4156SSadaf Ebrahimi for (i = start; i <= end; ++i)
261*9a0e4156SSadaf Ebrahimi tmp[j++] = str[i];
262*9a0e4156SSadaf Ebrahimi
263*9a0e4156SSadaf Ebrahimi tmp[j] = '\0';
264*9a0e4156SSadaf Ebrahimi strcpy(str, tmp);
265*9a0e4156SSadaf Ebrahimi
266*9a0e4156SSadaf Ebrahimi return;
267*9a0e4156SSadaf Ebrahimi }
268