Ilk eBPF Programi ve Tracepoint'ler
Reading syscall arrays
Önceki alıştırmada, execve system call’ından filename argument’ini ctx->args[0] kullanarak nasıl okuyacağınızı öğrendiniz.
Şimdi ikinci argument’i keşfedelim: argv. Şu şekilde bir komut çalıştırdığınızda:
./secret_app --password hunter2
Kernel bir argument dizisi alır:
argv[0]="./secret_app"argv[1]="--password"argv[2]="hunter2"argv[3]=NULL(sonlandırıcı)
execve manual sayfasına baktığımızda:
int execve(const char *filename, char *const argv[], char *const envp[]);
İkinci parametre olan argv, ctx->args[1] konumundadır.
Bir string’e basit bir pointer olan filename’den farklı olarak, argv ve envp pointer dizisine işaret eden pointer’lardır.
Diyagramda gördüğünüz gibi, argv ve envp bir NULL pointer ile sonlandırılır.
argv dizisinden bir girdi okuduğunuzda (örneğin argv[i]), kullanmadan önce NULL olup olmadığını kontrol edin, çünkü bu dizinin sonunu işaretler.
Pointer dizisini okuma
argv’yi okumak için şu adımları izlememiz gerekiyor:
ctx->args[1]’den argv pointer’ını alınunsigned long’danchar **tipine cast edin- Dizideki her pointer’ı okuyun (user space’den)
- Her pointer için, işaret ettiği string’i okuyun (yine user space’den)
Temel yapı şöyledir:
// Get the argv pointer
char **argv = (char **)ctx->args[1];
// In a loop, read the next pointer from the array
char *arg_ptr;
bpf_probe_read_user(&arg_ptr, sizeof(arg_ptr), &argv[i]);
// Remember to check for the NULL terminator!
// Read the string that pointer points to
char arg_buf[64];
bpf_probe_read_user_str(arg_buf, sizeof(arg_buf), arg_ptr);
Döngünün sabit bir üst sınırı olması gerektiğini unutmayın (örneğin i < 10), çünkü verifier programınızın sonlanacağını kanıtlaması gerekir.
Görev
Şüpheli bir program --password flag’i ve ardından gerçek parola ile çalıştırılıyor.
Yapmanız gerekenler:
argvdizisi üzerinde yineleyin (yinelemeyi 10 argument ile sınırlayın)"--password"içeren argument’i bulun- Gerçek parolayı içeren sonraki argument’i okuyun
SUBMIT_STR_LENile gönderin
Compare two strings for equality
- Args:
char* bufdynamic buffer to compareu32 buf_szlength of dynamic bufferconst char* buf2literal string to compare against
Read string from user space into kernel buffer
- Args:
void* dstkernel buffer to read intou32 sizemaximum bytes to readconst void* srcuser space pointer to string
Read bytes from user space into kernel buffer
- Args:
void* dstkernel buffer to read intou32 sizebytes to readconst void* srcuser space pointer