C ++: Können Funktionszeiger vor der Kompilierung auf die ursprüngliche Funktion zurückgeführt werden, ohne den Funktionsnamen zu betrachten?

9

Ich möchte einen Server einrichten, auf dem Schüler Code für einen Kurs hochladen und ausführen können. Ich möchte jedoch nicht, dass sie auf verschiedene Funktionen wie system () zugreifen, was einen schlechten Zugriff auf meinen Server ermöglichen könnte. Ich kann die Pre-Prozessor-Ausgabe für einen expliziten Funktionsaufruf durchsuchen, aber wenn der Benutzer einen Funktionszeiger wie folgt macht:

%Vor%

Ich bin immer noch offen für die Bedrohung. Ich kann jedoch nicht einfach nach der Zeichenfolge "system" suchen, da es sich um einen gültigen Namen handelt. Wenn der Student cstdlib nicht enthält, könnte er diesen Namen als Variablennamen verwenden. Da dies ein Programmierkurs ist, ist es eine schlechte Idee, eine schwarze Liste von zehn Meilen langen Variablennamen zu haben.

Gibt es eine Möglichkeit, die Funktionen anders als namentlich zu definieren und mir zu erlauben, nach dieser anderen Bezeichnung zu suchen, bevor ich ihren Code kompiliere?

    
Michael Stachowsky 28.07.2016, 14:17
quelle

2 Antworten

3

Bei weitem die einfachste Lösung ist, den Code zu kompilieren - das ist ziemlich harmlos - und dann die tatsächlichen Bibliotheksimporte zu betrachten. Benutzer haben möglicherweise ihr eigenes system definiert, aber das würde nicht dazu führen, dass system von glibc importiert wird.

importierte Symbole anzeigen

Der Hauptgrund, warum Sie sich den rohen Quellcode nicht ansehen können, ist, weil #define es böswilligen Benutzern erlaubt, die Namen der schwarzen Listen zu verstecken. Aber es gibt viele andere Möglichkeiten, dies zu tun, einschließlich

%Vor%

Sie benötigen also eine Verarbeitung der Quelle, und es ist wahrscheinlich am einfachsten, die gesamte Quelle vollständig zu verarbeiten.

    
MSalters 28.07.2016, 14:46
quelle
1

Ich würde auch vorschlagen, das in einem chroot als nicht-privilegierter Benutzer auszuführen. Es ist leichter als eine VM.

Leider ist es (leicht) nicht möglich, einen Funktionsnamen von einem Zeiger zu erhalten Wie erhält man den Namen der Funktion vom Zeiger der Funktion in C? < Diese Frage ist aus einer C-Perspektive, aber es ist im Wesentlichen das gleiche Problem.

    
Joshua Smith 28.07.2016 15:03
quelle

Tags und Links