gcc-Frage



  • #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ört 😉

    Man 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ört 😉

    Klar! 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ört 😉

    Klar! 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 ohne dialog kriegt man nichts direkt davon mit, sonst wird ja nen Dialog angezeigt (je nach dem was man dialog 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 ohne dialog kriegt man nichts direkt davon mit, sonst wird ja nen Dialog angezeigt (je nach dem was man dialog aufträgt).

    Ja, bei Linux ist das so, aber z.b. bei OS X und auch noch manch anderen Unix-basierten Systemen nicht 🙂


Anmelden zum Antworten