mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
Nasty code to generate unique files with the output of sys_execve arguments
This commit is contained in:
parent
7025b6f9cb
commit
e1e908b8cb
1 changed files with 56 additions and 6 deletions
|
@ -17,6 +17,7 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "aha.h"
|
#include "aha.h"
|
||||||
|
#include "os.h"
|
||||||
void flush_thread(void)
|
void flush_thread(void)
|
||||||
{
|
{
|
||||||
void *data = NULL;
|
void *data = NULL;
|
||||||
|
@ -70,19 +71,60 @@ long um_execve(char *file, char __user *__user *argv, char __user *__user *env)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* My uuid hack wuuuurgs, performance bye bye it is already gone with the
|
||||||
|
* massive amount of IO
|
||||||
|
*
|
||||||
|
* The filename is returned through parameters and the length of the string
|
||||||
|
* is returned. On error negative value is returned. See snprintf
|
||||||
|
*/
|
||||||
|
int create_filename(char *fn, int size){
|
||||||
|
int a,b;
|
||||||
|
long ncycles;
|
||||||
|
/* Query the processor cycles and concatenate it with a prefix */
|
||||||
|
asm volatile("rdtsc" : "=a" (a), "=d" (b));
|
||||||
|
ncycles = ((long long )a|(long long)b<<32);
|
||||||
|
/* Return the length of the string, negative value on failure */
|
||||||
|
return snprintf(fn,size,"AHA_%lx.out",ncycles);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO need to extract PID and PPID?
|
* TODO need to extract PID and PPID?
|
||||||
*/
|
*/
|
||||||
void dump_execve(char __user *file, char __user *__user *argv,
|
void dump_execve(char __user *file, char __user *__user *argv,
|
||||||
char __user *__user *env)
|
char __user *__user *env)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p, *a, *q;
|
||||||
char *a;
|
struct openflags flg;
|
||||||
|
int mode = 0644;
|
||||||
|
int fd,cnt;
|
||||||
|
|
||||||
|
flg.w = 1;
|
||||||
|
flg.c = 1;
|
||||||
|
cnt = 0;
|
||||||
|
/*
|
||||||
|
* FIXME Disk access is an good awfull solution; UML can be put on a
|
||||||
|
* tmfs as mitigation
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
p = kmalloc(MAX_DUMP_BUF,GFP_KERNEL);
|
p = kmalloc(MAX_DUMP_BUF,GFP_KERNEL);
|
||||||
if (p) {
|
q = kmalloc(MAX_DUMP_BUF, GFP_KERNEL);
|
||||||
/* Dump the file from execve */
|
if (p && q) {
|
||||||
|
if (create_filename(p,MAX_DUMP_BUF)<0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((fd = os_open_file(p,flg,mode))<0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Dump the file from execve */
|
||||||
if (strncpy_from_user(p,file,MAX_DUMP_BUF) > 0){
|
if (strncpy_from_user(p,file,MAX_DUMP_BUF) > 0){
|
||||||
printk("AHA:execve>file=%s\n",p);
|
cnt = snprintf((char*)q,MAX_DUMP_BUF,"AHA:execve>file=%s\n",p);
|
||||||
|
/* Best effort: If we manage to write ok if not it is also ok */
|
||||||
|
if ((cnt>0) & (cnt < MAX_DUMP_BUF))
|
||||||
|
os_write_file(fd,q,cnt);
|
||||||
|
|
||||||
}
|
}
|
||||||
/* Dump the arguments */
|
/* Dump the arguments */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -91,11 +133,19 @@ void dump_execve(char __user *file, char __user *__user *argv,
|
||||||
if (!a)
|
if (!a)
|
||||||
break;
|
break;
|
||||||
if (strncpy_from_user(p,a, MAX_DUMP_BUF) > 0) {
|
if (strncpy_from_user(p,a, MAX_DUMP_BUF) > 0) {
|
||||||
printk("AHA:argument=%s\n",p);
|
cnt=snprintf(q,cnt,"AHA:argument=%s\n",p);
|
||||||
|
if ((cnt>0) & (cnt<MAX_DUMP_BUF))
|
||||||
|
os_write_file(fd,q,cnt);
|
||||||
|
|
||||||
}
|
}
|
||||||
argv++;
|
argv++;
|
||||||
}
|
}
|
||||||
|
cnt = snprintf(q,cnt,"DONE\n");
|
||||||
|
if ((cnt >0) & (cnt < MAX_DUMP_BUF))
|
||||||
|
os_write_file(fd,q,cnt);
|
||||||
|
os_close_file(fd);
|
||||||
kfree(p);
|
kfree(p);
|
||||||
|
kfree(q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue