gcc-Frage
-
lagalopex schrieb:
Du kannst sämliche Strings verschlüsselt in deinem Programm abspeichern und dann zur Laufzeit entschlüsseln und
system
übergeben.Danke für die Antwort!
Das war allerdings gar nicht der Punkt, sondern es ging darum, dass Aufrufe wie z.b.:
system( "mkdir ~/TEST" );
im binary KLAR drin stehen!
Ich habe das Prob jetzt anders gelöst, aber mich hätte trotzdem mal interessiert, warum das nur bei System-Aufrufen so ist und wie man das verhindert.
-
#include <stdlib.h> #include <stdio.h> int main() { int i; char txt[20] = "\xc0\xc6\xcd\xca\x85\xd1\xc0\xd6\xd1\x85\xc0\xc6\xcd\xca\x85\xc0\xcb\xc6\xa5"; for (i = 0; txt[i] ^ (char)0xa5; ++i) txt[i] ^= 0xa5; txt[i] = 0; printf("Herzlich Willkommen\n"); system("echo test echo plain"); system(txt); return 0; }
$ gcc -o testenc testenc.c ./testenc Herzlich Willkommen test echo plain test echo enc $ strings testenc [...] Herzlich Willkommen echo test echo plain markus@F209 ~/Desktop $ ltrace ./testenc > /dev/null __libc_start_main(0x400558, 1, 0x7fff2e4bcec8, 0x400600, 0x4005f0 <unfinished ...> puts("Herzlich Willkommen") = 20 system("echo test echo plain" <unfinished ...> --- SIGCHLD (Child exited) --- <... system resumed> ) = 0 system("echo test echo enc" <unfinished ...> --- SIGCHLD (Child exited) --- <... system resumed> ) = 0 +++ exited (status 0) +++
Erkennst du was
EDIT:
Keine Verschlüsselung, aber es steht nichtmehr direkt als String im Binary.txt[0]='e'; txt[1]='c'; txt[2]='h'; txt[3]='o'; txt[4]=' '; txt[5]='t'; txt[6]='e'; txt[7]='s'; txt[8]='t'; txt[9]=' '; txt[10]='e'; txt[11]='c'; txt[12]='h'; txt[13]='o'; txt[14]=' '; txt[15]='e'; txt[16]='n'; txt[17]='c'; txt[18]=0;
-
Alle Strings werden im Binary als "plain text" gespeichert.
$ cat > foo.c #include <stdlib.h> #include <stdio.h> int main() { printf("foo bar baz\n"); system("echo 'foo bar baz'"); } $ gcc foo.c $ strings a.out /lib/ld-linux.so.2 __gmon_start__ libc.so.6 _IO_stdin_used puts system __libc_start_main GLIBC_2.0 PTRh [^_] foo bar baz echo 'foo bar baz' $ ./a.out foo bar baz foo bar baz
Aber auch eine "Verschlüsselung" bringt natürlich nichts. Einerseits steht der Schlüssel dafür ja eh im Quellcode und andererseits ist es auch kinderleicht auszulesen, was du an system übergibst.
$ strace -f ./a.out 2>&1 | grep "/bin/sh" [pid 11286] execve("/bin/sh", ["sh", "-c", "echo \'foo bar baz\'"], [ /* 28 vars */]) = 0
<edit>
Ups, da war lagaloplex ein bisschen schneller.
</edit>
-
Aaah, ok, verstehe, danke euch Beiden!
Was mich nur wunderte, wenn ich ein xbeliebiges Programm-binary mit einem Texteditor öffne, dann steht da nur cryptischer Zeichensalat drin und wenn ich meines im Texteditor öffne, stehen da die System-Anweisungen im Klartext drin!
-
Also die normalen Strings sieht man in jedem Programm. Es kann aber durchaus sein, dass dein Programm so klein ist und Scripte nun wieder sehr lange Strings sind, dass einfach das Verhältnis etwas anders ist
Normal sind auch die Strings alle in einer Section eher am Ende der Datei.Das Programm
strings
ist ganz hilfreich Strings zu erkennen.
(strings /bin/echo
gibt zum Beispiel auch den Hilfetext und so aus)Aber ganz davon abgesehen ist es sehr schlechter Stil ständig
system
zu benutzen. Viele Aufgaben lassen sich direkt und einfach in C lösen, für anderen muss man schon etwas mehr Aufwand treiben.
Frage ist natürlich auch, was das Programm überhaupt macht.
-
lagalopex schrieb:
Also die normalen Strings sieht man in jedem Programm. Es kann aber durchaus sein, dass dein Programm so klein ist und Scripte nun wieder sehr lange Strings sind, dass einfach das Verhältnis etwas anders ist
Jo, ist mir dann auch aufgefallen
Normal sind auch die Strings alle in einer Section eher am Ende der Datei
Stimmt!
Das Programm
strings
ist ganz hilfreich Strings zu erkennen.
(strings /bin/echo
gibt zum Beispiel auch den Hilfetext und so aus)Guck ich mir mal an, danke!
Aber ganz davon abgesehen ist es sehr schlechter Stil ständig
system
zu benutzen. Viele Aufgaben lassen sich direkt und einfach in C lösen, für anderen muss man schon etwas mehr Aufwand treiben.Bei Shellscripts bin ich nur besser als bei C
Frage ist natürlich auch, was das Programm überhaupt macht.
Nix wildes eigentlich! Ein bisschen locate, grep, sed, awk, cp.
-
plumps34 schrieb:
Frage ist natürlich auch, was das Programm überhaupt macht.
Nix wildes eigentlich! Ein bisschen locate, grep, sed, awk, cp.
Dafür sind eigentlich Shell-Skripte erfunden worden
-
Dafür sind eigentlich Shell-Skripte erfunden worden
Weiss ich doch
Ich wollt halt nur ein binary draus machen, damit`s komfortabler ist und auch noch ein paar Vollzugsmeldungen OHNE Terminalfenster ausschmeisst - quasi `ne lütte "linux-exe"
-
plumps34 schrieb:
Dafür sind eigentlich Shell-Skripte erfunden worden
Weiss ich doch
Ich wollt halt nur ein binary draus machen, damit`s komfortabler ist und auch noch ein paar Vollzugsmeldungen OHNE Terminalfenster ausschmeisst - quasi `ne lütte "linux-exe"Ich fände das eher unkonfortabler. Wenn es leicht in ein Shell-Skript umzusetzen ist, braucht man kein Binary. Denn mit dem Binary wirds (häufig) größer, architekturabhängig und schwerer anpassbar.
Und ohne Terminalfenster... schonmal
dialog
(und seinen Varianten) gehörtMan kann schon ne Menge skripten (die Bash ist schon ziemlich mächtig und mit den Standard-Tools wirds noch besser) und häufig geht es leichter und schneller als ein Programm zu schreiben. Und genau für solche Aufgaben wurde das ja gemacht.
Aber es ist ja deine Entscheidung wie du es nun schlussendlich machst. Übung hattest du jetzt zumindest
-
Und ohne Terminalfenster... schonmal
dialog
(und seinen Varianten) gehörtKlar! Damit mache ich auch viel, aber das läuft übrigens auch in einem Terminalfenster
Aber es ist ja deine Entscheidung wie du es nun schlussendlich machst. Übung hattest du jetzt zumindest
Genau - und das kann ja nie schaden
DANKE noch mal!
-
plumps34 schrieb:
Und ohne Terminalfenster... schonmal
dialog
(und seinen Varianten) gehörtKlar! Damit mache ich auch viel, aber das läuft übrigens auch in einem Terminalfenster
Ich weiß jetzt nicht was du mit Terminalfenster meinst. Wenn ich nen Skript nehme (egal ob da jetzt
dialog
aufgerufen wird), es ausführbar mache und mit der Maus draufklicke, wird das Skript ohne ein "Terminalfenster" ausgeführt. Also ohnedialog
kriegt man nichts direkt davon mit, sonst wird ja nen Dialog angezeigt (je nach dem was mandialog
aufträgt).
-
Ich weiß jetzt nicht was du mit Terminalfenster meinst.
Terminal = bash, shell etc.
Unter OS X heisst das Ding Terminal, Beim PC Eingabeaufforderung oder DOS-console, als externes ssh Proggi z.b. putty etc.Wenn ich nen Skript nehme (egal ob da jetzt
dialog
aufgerufen wird), es ausführbar mache und mit der Maus draufklicke, wird das Skript ohne ein "Terminalfenster" ausgeführt. Also ohnedialog
kriegt man nichts direkt davon mit, sonst wird ja nen Dialog angezeigt (je nach dem was mandialog
aufträgt).Ja, bei Linux ist das so, aber z.b. bei OS X und auch noch manch anderen Unix-basierten Systemen nicht