Skip to content

Commit b1d1eb1

Browse files
task 6
1 parent 8f23ddf commit b1d1eb1

File tree

7 files changed

+452
-16
lines changed

7 files changed

+452
-16
lines changed

0x0b-strace/Makefile

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ SRC5 = $(patsubst %,$(SDIR)/%,$(_SRC5))
4747
_OBJ5 = $(_SRC5:.c=.o)
4848
OBJECTS5 = $(patsubst %,$(ODIR)/%,$(_OBJ5))
4949

50+
_SRC6 = strace_6.c \
51+
utils.c \
52+
handle_syscall_macros.c
53+
54+
SRC6 = $(patsubst %,$(SDIR)/%,$(_SRC6))
55+
56+
_OBJ6 = $(_SRC6:.c=.o)
57+
OBJECTS6 = $(patsubst %,$(ODIR)/%,$(_OBJ6))
58+
5059
_DEPS = strace.h
5160
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
5261

@@ -60,11 +69,12 @@ OUTPUT2 = strace_2
6069
OUTPUT3 = strace_3
6170
OUTPUT4 = strace_4
6271
OUTPUT5 = strace_5
72+
OUTPUT6 = strace_6
6373

6474
$(ODIR)/%.o : $(SDIR)/%.c
6575
$(CC) $(CFLAGS) -c -o $@ $< -I$(IDIR)
6676

67-
all : $(OUTPUT) $(OUTPUT1) $(OUTPUT2) $(OUTPUT3) $(OUTPUT4) $(OUTPUT5)
77+
all : $(OUTPUT) $(OUTPUT1) $(OUTPUT2) $(OUTPUT3) $(OUTPUT4) $(OUTPUT5) $(OUTPUT6)
6878

6979
$(OUTPUT) : $(OBJECTS)
7080
$(CC) -o $@ $^ $(LINKS)
@@ -84,9 +94,12 @@ $(OUTPUT4) : $(OBJECTS4)
8494
$(OUTPUT5) : $(OBJECTS5)
8595
$(CC) -o $@ $^ $(LINKS)
8696

97+
$(OUTPUT6) : $(OBJECTS6)
98+
$(CC) -o $@ $^ $(LINKS)
99+
87100
.PHONY : clean
88101

89102
clean :
90-
rm -f $(OUTPUT) $(OBJECTS) $(OUTPUT1) $(OBJECTS1) $(OUTPUT2) $(OBJECTS2) $(OUTPUT3) $(OBJECTS3) $(OUTPUT4) $(OBJECTS4) $(OUTPUT5) $(OBJECTS5)
103+
rm -f $(OUTPUT) $(OBJECTS) $(OUTPUT1) $(OBJECTS1) $(OUTPUT2) $(OBJECTS2) $(OUTPUT3) $(OBJECTS3) $(OUTPUT4) $(OBJECTS4) $(OUTPUT5) $(OBJECTS5) $(OUTPUT6) $(OBJECTS6)
91104

92-
re: $(OBJ) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) $(OBJ5)
105+
re: $(OBJ) $(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) $(OBJ5) $(OBJ6)

0x0b-strace/README.md

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,14 +291,110 @@ exit_group(0) = ?
291291
- unsigned long
292292
- pid_t
293293

294-
294+
295295
Usage: ./strace_5 command [args...]
296296

297297
```
298298
$make strace_5
299299
[...]
300300
$./strace_5 /bin/echo Holberton
301+
execve("/bin/echo", ["/bin/echo", "Holberton"], [/* 75 vars */]) = 0
302+
brk(0) = 27238400
303+
access("/etc/ld.so.nohwcap", 0) = -2
304+
mmap(0, 8192, 3, 34, -1, 0) = 0x7f8a29bf2000
305+
access("/etc/ld.so.preload", 4) = -2
306+
open("/etc/ld.so.cache", 524288) = 3
307+
fstat(3, 0x7ffe44a07da0) = 0
308+
mmap(0, 95206, 1, 2, 3, 0) = 0x7f8a29bda000
309+
close(3) = 0
310+
access("/etc/ld.so.nohwcap", 0) = -2
311+
open("/lib/x86_64-linux-gnu/libc.so.6", 524288) = 3
312+
read(3, 0x7ffe44a07f40, 832) = 832
313+
fstat(3, 0x7ffe44a07df0) = 0
314+
mmap(0, 3965632, 5, 2050, 3, 0) = 0x7f8a29609000
315+
mprotect(0x7f8a297c7000, 2097152, 0) = 0
316+
mmap(0x7f8a299c7000, 24576, 3, 2066, 3, 0x1be000) = 0x7f8a299c7000
317+
mmap(0x7f8a299cd000, 17088, 3, 50, -1, 0) = 0x7f8a299cd000
318+
close(3) = 0
319+
mmap(0, 4096, 3, 34, -1, 0) = 0x7f8a29bd9000
320+
mmap(0, 8192, 3, 34, -1, 0) = 0x7f8a29bd7000
321+
arch_prctl(4098, 140231382497088) = 0
322+
mprotect(0x7f8a299c7000, 16384, 1) = 0
323+
mprotect(0x606000, 4096, 1) = 0
324+
mprotect(0x7f8a29bf4000, 4096, 1) = 0
325+
munmap(0x7f8a29bda000, 95206) = 0
326+
brk(0) = 27238400
327+
brk(0x1a1b000) = 27373568
328+
open("/usr/lib/locale/locale-archive", 524288) = 3
329+
fstat(3, 0x7f8a299ccb60) = 0
330+
mmap(0, 7216688, 1, 2, 3, 0) = 0x7f8a28f27000
331+
close(3) = 0
332+
fstat(1, 0x7ffe44a08500) = 0
333+
mmap(0, 4096, 3, 34, -1, 0) = 0x7f8a29bf1000
334+
write(1, 0x7f8a29bf1000, 10Holberton
335+
) = 10
336+
close(1) = 0
337+
munmap(0x7f8a29bf1000, 4096) = 0
338+
close(2) = 0
339+
exit_group(0) = ?
340+
$
341+
```
342+
343+
* strace_6.c - A program that executes and traces a given command. Each time a syscall is intercepted, prints its name, arguments and return values, followed by a new line
344+
345+
Note: Handles only following macros and flags
346+
- NULL
347+
- All the flags for the mmap, open and access functions
348+
349+
Usage: ./strace_6 command [args...]
350+
351+
```
352+
$make strace_6
353+
[...]
354+
$./strace_6 /bin/echo Holberton
355+
execve("/bin/echo", ["/bin/echo", "Holberton"], [/* 75 vars */]) = 0
356+
brk(0) = 23924736
357+
access("/etc/ld.so.nohwcap", F_OK) = -2
358+
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6d10c76000
359+
access("/etc/ld.so.preload", R_OK) = -2
360+
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
361+
fstat(3, 0x7ffd6f887a30) = 0
362+
mmap(NULL, 95206, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d10c5e000
363+
close(3) = 0
364+
access("/etc/ld.so.nohwcap", F_OK) = -2
365+
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
366+
read(3, 0x7ffd6f887bd0, 832) = 832
367+
fstat(3, 0x7ffd6f887a80) = 0
368+
mmap(NULL, 3965632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f6d1068d000
369+
mprotect(0x7f6d1084b000, 2097152, 0) = 0
370+
mmap(0x7f6d10a4b000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1be000) = 0x7f6d10a4b000
371+
mmap(0x7f6d10a51000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f6d10a51000
372+
close(3) = 0
373+
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6d10c5d000
374+
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6d10c5b000
375+
arch_prctl(4098, 140106409555776) = 0
376+
mprotect(0x7f6d10a4b000, 16384, 1) = 0
377+
mprotect(0x606000, 4096, 1) = 0
378+
mprotect(0x7f6d10c78000, 4096, 1) = 0
379+
munmap(0x7f6d10c5e000, 95206) = 0
380+
brk(0) = 23924736
381+
brk(0x16f2000) = 24059904
382+
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
383+
fstat(3, 0x7f6d10a50b60) = 0
384+
mmap(NULL, 7216688, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d0ffab000
385+
close(3) = 0
386+
fstat(1, 0x7ffd6f888190) = 0
387+
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6d10c75000
388+
write(1, 0x7f6d10c75000, 10Holberton
389+
) = 10
390+
close(1) = 0
391+
munmap(0x7f6d10c75000, 4096) = 0
392+
close(2) = 0
393+
exit_group(0) = ?
394+
$
301395
```
396+
397+
302398
## Resources:
303399

304400
* [syscalls](https://filippo.io/linux-syscall-table/)

0x0b-strace/inc/strace.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <unistd.h>
55
#include <string.h>
6+
#include <fcntl.h>
67
#include <sys/wait.h>
78
#include <sys/ptrace.h>
89
#include <stdio.h>
@@ -12,6 +13,7 @@
1213
#include <sys/utsname.h>
1314
#include <sys/user.h>
1415
#include <sys/types.h>
16+
#include <sys/mman.h>
1517

1618
#include "syscalls.h"
1719

@@ -31,5 +33,9 @@ typedef int bool;
3133
bool is_machine_32(void);
3234
unsigned long get_syscall_arg(struct user_regs_struct regs, int n);
3335
char *read_string(pid_t child, unsigned long addr);
34-
void print_arg(unsigned long arg, type_t arg_type);
36+
void print_arg(unsigned long arg, type_t arg_type, bool deal_null);
37+
void handle_syscall_macros(const char *name, unsigned long arg, int arg_index);
38+
void handle_syscall_access(unsigned long arg);
39+
void handle_syscall_mmap(int arg_index, unsigned long arg);
40+
void handle_syscall_open(unsigned long arg);
3541
#endif
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
#include "strace.h"
2+
3+
/**
4+
* handle_syscall_open - Resolves flags and macros for open syscall
5+
* @arg: argument of the syscall
6+
*/
7+
void handle_syscall_open(unsigned long arg)
8+
{
9+
if (arg & O_WRONLY)
10+
printf("%s", "O_WRONLY");
11+
else if (arg & O_RDWR)
12+
printf("%s", "O_RDWR");
13+
else
14+
printf("%s", "O_RDONLY");
15+
if (arg & O_CLOEXEC)
16+
printf("|%s", "O_CLOEXEC");
17+
if (arg & O_CREAT)
18+
printf("|%s", "O_CREAT");
19+
if (arg & O_DIRECTORY)
20+
printf("|%s", "O_DIRECTORY");
21+
if (arg & O_EXCL)
22+
printf("|%s", "O_EXCL");
23+
if (arg & O_NOCTTY)
24+
printf("|%s", "O_NOCTTY");
25+
if (arg & O_NOFOLLOW)
26+
printf("|%s", "O_NOFOLLOW");
27+
if (arg & O_TRUNC)
28+
printf("|%s", "O_TRUNC");
29+
}
30+
31+
/**
32+
* handle_syscall_mmap - Resolves flags and macros for mmap syscall
33+
* @arg: argument of the syscall
34+
* @arg_index: index of the argument
35+
*/
36+
void handle_syscall_mmap(int arg_index, unsigned long arg)
37+
{
38+
bool bitwised = false;
39+
40+
if (arg_index == 2)
41+
{
42+
if (arg & PROT_READ)
43+
{
44+
if (bitwised)
45+
printf("|");
46+
printf("%s", "PROT_READ");
47+
bitwised = true;
48+
}
49+
if (arg & PROT_WRITE)
50+
{
51+
if (bitwised)
52+
printf("|");
53+
printf("%s", "PROT_WRITE");
54+
bitwised = true;
55+
}
56+
if (arg & PROT_EXEC)
57+
{
58+
if (bitwised)
59+
printf("|");
60+
printf("%s", "PROT_EXEC");
61+
bitwised = true;
62+
}
63+
if (arg & PROT_NONE)
64+
{
65+
if (bitwised)
66+
printf("|");
67+
printf("%s", "PROT_NONE");
68+
}
69+
} else
70+
{
71+
if (arg & MAP_SHARED)
72+
printf("%s", "MAP_SHARED");
73+
else if (arg & MAP_PRIVATE)
74+
printf("%s", "MAP_PRIVATE");
75+
if (arg & MAP_32BIT)
76+
printf("|%s", "MAP_32BIT");
77+
if (arg & MAP_FIXED)
78+
printf("|%s", "MAP_FIXED");
79+
if (arg & MAP_FILE)
80+
printf("|%s", "MAP_FILE");
81+
if (arg & MAP_ANON)
82+
printf("|%s", "MAP_ANONYMOUS");
83+
else if (arg & MAP_ANONYMOUS)
84+
printf("|%s", "MAP_ANONYMOUS");
85+
if (arg & MAP_DENYWRITE)
86+
printf("|%s", "MAP_DENYWRITE");
87+
if (arg & MAP_EXECUTABLE)
88+
printf("|%s", "MAP_EXECUTABLE");
89+
if (arg & MAP_GROWSDOWN)
90+
printf("|%s", "MAP_GROWSDOWN");
91+
if (arg & MAP_HUGETLB)
92+
printf("|%s", "MAP_HUGETLB");
93+
if (arg & MAP_LOCKED)
94+
printf("|%s", "MAP_LOCKED");
95+
if (arg & MAP_NONBLOCK)
96+
printf("|%s", "MAP_NONBLOCK");
97+
if (arg & MAP_NORESERVE)
98+
printf("|%s", "MAP_NORESERVE");
99+
if (arg & MAP_POPULATE)
100+
printf("|%s", "MAP_POPULATE");
101+
if (arg & MAP_STACK)
102+
printf("|%s", "MAP_STACK");
103+
}
104+
}
105+
106+
/**
107+
* handle_syscall_access - Resolves flags and macros for access syscall
108+
* @arg: argument of the syscall
109+
*/
110+
void handle_syscall_access(unsigned long arg)
111+
{
112+
switch (arg)
113+
{
114+
case F_OK:
115+
printf("%s", "F_OK");
116+
break;
117+
case R_OK:
118+
printf("%s", "R_OK");
119+
break;
120+
case W_OK:
121+
printf("%s", "W_OK");
122+
break;
123+
case X_OK:
124+
printf("%s", "X_OK");
125+
break;
126+
case R_OK | W_OK:
127+
printf("%s", "R_OK|W_OK");
128+
break;
129+
case W_OK | X_OK:
130+
printf("%s", "W_OK|X_OK");
131+
break;
132+
case R_OK | X_OK:
133+
printf("%s", "R_OK|X_OK");
134+
break;
135+
case R_OK | W_OK | X_OK:
136+
printf("%s", "R_OK|W_OK|X_OK");
137+
break;
138+
}
139+
}
140+
141+
/**
142+
* handle_syscall_macros - Resolves flags and macros for specific syscalls
143+
* @name: name of the syscall
144+
* @arg: argument of the syscall
145+
* @arg_index: index of the argument
146+
*/
147+
void handle_syscall_macros(const char *name, unsigned long arg, int arg_index)
148+
{
149+
150+
if (!strcmp(name, "mmap"))
151+
handle_syscall_mmap(arg_index, arg);
152+
else if (!strcmp(name, "access"))
153+
handle_syscall_access(arg);
154+
else if (!strcmp(name, "open"))
155+
handle_syscall_open(arg);
156+
}

0x0b-strace/src/strace_5.c

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,14 @@ void print_syscall_args(pid_t child_pid, int argc, char *const argv[],
7474
{
7575
arg = get_syscall_arg(regs, i);
7676

77-
if (syscalls_64_g[(size_t) regs.orig_rax].params[i] ==
78-
VARARGS)
77+
if (syscalls_64_g[(size_t) regs.orig_rax].params[i] == VARARGS)
7978
printf("...");
8079
else
8180
{
82-
if (syscalls_64_g[(size_t) regs.orig_rax].params
83-
[i] == CHAR_P)
81+
if (syscalls_64_g[(size_t) regs.orig_rax].params[i] == CHAR_P)
8482
printf("\"%s\"", read_string(child_pid, arg));
8583
else
86-
print_arg(arg,
87-
syscalls_64_g[(size_t)
88-
regs.orig_rax].
89-
params[i]);
84+
print_arg(arg, syscalls_64_g[(size_t)regs.orig_rax].params[i], false);
9085
}
9186
if (i < nargs - 1)
9287
printf(", ");
@@ -129,7 +124,7 @@ void run_tracer(pid_t child_pid, int argc, char *const argv[],
129124
ptrace(PTRACE_GETREGS, child_pid, 0, &regs);
130125
printf(") = ");
131126
print_arg((unsigned long)regs.rax,
132-
syscalls_64_g[(size_t) regs.orig_rax].ret);
127+
syscalls_64_g[(size_t) regs.orig_rax].ret, false);
133128
printf("\n");
134129
}
135130
}

0 commit comments

Comments
 (0)