gcc-Frage
-
Hallo,
habe ein kleines Programm mit C geschrieben und wenn ich das dann mit gcc compiliere, läuft es auch!
2 Fragen dazu:
1. In dem Programm sind diverse Aufrufe mit "system" und Shell-Befehle, die dann im binary als Klartext stehen. Kann man das verhindern?
2. Gibt es die Möglichkeit gcc anzuweisen, dass er alle benötigten libs/"sourcen" einbindet, damit das binary auch auf Rechnern läuft, wo diese nicht installiert sind?
Anfängerfragen, ich weiss...
Danke!
-
1. Und warum willst du das tun?
2. statisch linken
-
warum denn schrieb:
1. Und warum willst du das tun?
Reicht es nicht, dass ich es tun will?
warum denn schrieb:
2. statisch linken
Welche Option muss ich bei gcc dazu aufrufen?
-
1. Nein. Du könntest natürlich die Daten ändern und im Programm in klartext umwandeln. Aber das bietet keine wirkliche Sicherheit.
2. -static, siehe auch man: gcc
-
rüdiger schrieb:
1. Du könntest natürlich die Daten ändern und im Programm in klartext umwandeln. Aber das bietet keine wirkliche Sicherheit
1. Binärcode würde mir schon reichen!
rüdiger schrieb:
2. -static, siehe auch man: gcc
OK!
-
plumps34 schrieb:
Reicht es nicht, dass ich es tun will?
nö. du hast offenbar etwas zu verheimlichen, da will man normalerweise schon gerne rausfinden ob man es mit seinem gewissen vereinbaren kann, dir zu helfen.
plumps34 schrieb:
Binärcode würde mir schon reichen!
äh wie? der lesbare text in deinem programm IST binär, genau wie alle anderen daten auf deinem computer auch. das ist das grundlegende prinzip digitaler datenverarbeitung.
-
punkbuster schrieb:
plumps34 schrieb:
Reicht es nicht, dass ich es tun will?
nö. du hast offenbar etwas zu verheimlichen, da will man normalerweise schon gerne rausfinden ob man es mit seinem gewissen vereinbaren kann, dir zu helfen.
Du hast offensichtlich ein Weltverschwörungs-Syndrom!
punkbuster schrieb:
plumps34 schrieb:
Binärcode würde mir schon reichen!
äh wie? der lesbare text in deinem programm IST binär, genau wie alle anderen daten auf deinem computer auch. das ist das grundlegende prinzip digitaler datenverarbeitung.
Einfach noch mal die Ausgangsfrage lesen und geistig auch verarbeiten?
-
Was ist denn das hier für ein Kindergarten?!?!
@plumps: wenn du offenbar mehr weißt als dieses Forum von dem du dir Hilfe versprichst, kann man erwarten dass du uns Aufklärst. WAS nud WARUN willst du das tun? Das ist eine berechtigte Frage und ein "sag ich nicht" wird nicht genügen.
Schönen Abend die Herren/Damen
-
Du kannst sämliche Strings verschlüsselt in deinem Programm abspeichern und dann zur Laufzeit entschlüsseln und
system
übergeben. Das kann von leicht bis zeimlich schwer reichen, je nach Algorithmus. Bringen tut es dir aber rein garnichts, da du halt die Strings wieder entschlüsseln musst (evtl. Kennwort liegt vor) und somit wieder im Klartext vorliegen (wenn auch nur bei der Progammausführung.)
Ergo, wenn man sich nur ein kleines bischen auskennt, ist es nur für dich ein erheblicher Mehraufwand. Für einen "bösen Angreifer" nicht.
Aber mach dir mal Gedanken wie sinnvoll so ein Mist in einem Linux System istUnd statisch braucht man nur sehr selten linken. Ne glibc ist auf jedem vollwertigen Linux System. Aber ist natürlich deine Wahl.
-
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).