Jako kostru použijte tracer.tgz.
Hodnoty systemových volání viz /usr/include/asm/unistd_64.h např.: http://lxr.linux.no/linux+v2.6.23.17/include/asm-x86_64/unistd.h
Pořadí parametrů v registerech viz A.2.1 http://www.x86-64.org/documentation/abi.pdf
tracer [-x trace.xml | -p trace.pl] /path/to/command [args]
R1: Argument -x způsobí tisk sledované stopy systémových volání do XML souboru.
R2: Argument -p způsobí tisk sledované stropy systémových volání do souboru databáze Prologu (SWI-Prolog).
R3: Zdrojové kódy společně s Makefile
odevzdejte v adresáři tracer
zabalené v archivu xlogin99.zip
nebo xlogin99.tgz
.
R4: Sledujte systémová volání jednoho procesu (žádný fork, vfork, clone).
R5: Signály příchozí sledovanému procesu ignorujte.
Formát a příklad výstupu v XML viz syscalltrace.xml.
Požadavky (requests) na chování a formát výpisu v XML:
R10: Element <name>
je nepovinný (ale razantně přispívá hodnocení).
R11: Atribut name u elementu <arg>
je nepovinný (ale přispívá k hodnocení). Jeho
název zjistěte z manuálovych stránek (pozor, název se v různých manpages
může lišit): http://man7.org/linux/man-pages/dir_section_2.html
R12: Některé hodnoty argumentu je potřeba číst PŘED systémovým voláním (viz např. exit(2)).
R13: Některé hodnoty argumentu (data, na která ukazuje argument sys. volání) dávají smysl vypisovat až po znalosti jejich délky (např. podle retcode read(2) nebo podle retcode getdents(2)).
R14: Pokud je typ argumentu celočíselný (int, unsigned, prip. long varianty),
pak tiskněte hodnotu argumentu jako text podelementu <value>
.
R15: Pokud je typ argumentu ukazatel, tisk ukazatele jako hexadecimální hodnotu
v printf formatu "0x\x"
do podelementu <value>
.
R16: Pokud je ukazatel roven NULL, tisk "NULL"
.
R17: Pokud se jedná o ukazatel na znak (char*
), tisk hodnoty ukazatele (viz
element <value>
) a následně dat řetězce (viz element <data>
).
Netisknutelné znaky v řetezci (použijte isprint(3)) pomocí printf formatů
"\\x%02x"
. Zpětné lomítko je třeba escapovat ("\\\\"
).
R18: Pokud je typ argumentu celočíselný, ale nevyjadřuje počet (typicky např.
práva nebo režim přístupu apod.), potom hodnotu argumentu do elementu
<value>
a význam do podelementu <symbolic>
.
R19: Symbolický význam celočíselného argumentu (pokud to odpovídá manuálové stránce) by měl být reprezentován OR-redukcí symbolických konstant (v manpage hledejte "bitwise" a "or" případně "bitwise-or").
R20: Pokud se jedna o ukazatel na strukturu, tisk obsahu struktury do
podelementu <struct name="JMENO_STRUKTURY">
. Jednotlive hodnoty prvku
struktury tisknout stejným způsobem jako argumenty (namísto elementu <arg>
použít <item>
).
R21: Pokud se jedná o ukazatel na pole struktur, potom seznam struktur obalit
do elementu <array>
.
Splnění požadavků R17 a R20 povede k nadprůměrnému hodnocení. Požadavky R18, R19 a R21 jsou bonusové.
Příklad výstupu ve formátu PROLOG viz syscalltrace.pl
R30: Každý záznam o systémovém volání obsahuje časovou značku (první začína hodnotou 1).
R31: Všechny údaje (kromě typu char*
) jsou celočíslené v desítkové soustavě.
Podle významu parametru nebo návratové hodnoty je číslo znaménkové nebo
bezznaménkové.
R32: Parametry (příp. naplněná data jádrem) typu char*
jsou vypsána jako
řetězec. Netisknutelné znaky (!isprint()) budou vytištěna formátem
"\\x%02x\\"
.
Sledujte následující systémová volání. Druhý, příp. třetí sloupec ignorujte (slouží při zadávání projektu pro přehled obtížnosti).
close int
fchdir int
fchown int,uint,uint
chdir char*
rmdir char*
unlink char*
chroot char*
rename char*,char*
chown char*,uint,uint
getcwd char*,size_t
open char*,int,mode_t consts,or
access char*,int consts,or
mkdir char*,mode_t consts,or
chmod char*,mode_t consts,or
fchmod int,mode_t consts,or
stat char*,struct stat* struct
lstat char*,struct stat* struct
getdents uint,struct linux_dirent*,uint struct,array
getdents64 uind,struct linux_dirent*,uint struct,array
close int
fsync int
ftruncate int,off_t
lseek int,off_t,int consts
unlink char*
rename char*,char*
truncate char*,off_t
read int,void*,size_t buf
write int,void*,size_t buf
open char*,int,mode_t consts,or
access char*,int consts,or
creat char*,mode_t consts,or
munlockall void
brk void* retcode viz manpage
munlock void*,size_t
mlock void*,size_t
munmap void*,size_t
mlockall int const,or
mmap void*,size_t,int,int,int,off_t const,or
mprotect void*,size_t,int const,or
msync void*,size_t,int const,or
exit int param + retcode viz manpage
exit_group int
semctl* int,int,int,union(int,void*) const,union
semget key_t,int,int const,or,mask
futex* int*,int,int,struct timespec*,int*,int const,struct
semop* int,struct sembuf*,uint struct,array
Skript gimme-etc-ro-files.sh obsahuje dotaz dynamické analýzy testovaného programu v podobě XPath výrazu nad XML DOM.
$ ./tracer -x syscalltrace.xml /path/to/command
$ ./gimme-etc-ro-files.sh syscalltrace.xml
Found 1 nodes:
-- NODE --
/etc/group