2013-03-25 26 views
8

Jestem w klasie bezpieczeństwa oprogramowania i obecnie uczymy się o przepełnieniach bufora i sposobie ich wykorzystania. Mam program, który wiem, jak wykorzystać, ale wydaje mi się, że nie jestem w stanie tego zrobić, ponieważ muszę napisać heks, że nie pozwala mi pisać.Napisz hex w GDB

muszę napisać dane wygenerowane z:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' 

Jednak nie mogę przekierować to wyjście do argumentów wiersza poleceń, ponieważ program działa interaktywnie. Historycznie, użyłem xclip do skopiowania go do schowka, a następnie wkleje do działającej aplikacji, ale z jakiegoś powodu ta sekwencja szesnastkowa nie pozwala mi użyć xclip do skopiowania (pokazuje, że nic nie zostało skopiowane).

Na przykład:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' | xclip -sel clip 

Gdybym Ctrl + V po tym, nic nie zostanie wklejony. Jeśli po prostu skopiuję i wkleję dane wyjściowe z okna terminala, niewłaściwy hex zostanie wklejony (zakładam, że jest tak ponieważ hex nie jest widoczny ASCII).

Moje pytanie brzmi: czy GDB może w jakiś sposób wstawić wygenerowany tekst do interaktywnego, działającego programu?

Jestem świadomy, że jeśli program wykorzystywaną wziął argumenty wiersza poleceń, co mogłem zrobić:

run $(perl -e 'print "A"x48; print "\x1b\x88\x04\x08";') 

Ale ponieważ nie można uruchomić poprzez argumenty CLI, to nie nadaje się do użytku.

Każda pomoc będzie świetna!

+0

można przekierować standardowe wejście do odczytu z pliku lub potoku. –

+0

Jak mogę to zrobić I uruchomić GDB z punktami przerw w tym samym czasie? Wiem, że mogę zrobić "perl -e ... | ./program", ale to nie uruchamia gdb z punktami przerwania. "perl -e ... | gdb ./program" uruchamia gdb, ale nie uruchamia programu ani nie używa punktów przerwania. – Chris

+0

Możesz wprowadzić te z klawiatury ... http://superuser.com/questions/59418/how-to-type-special-characters-in-linux –

Odpowiedz

19

Moje pytanie brzmi: czy GDB może w jakiś sposób wstawić wygenerowany tekst do interaktywnego, działającego programu?

Twoje pytanie jest na podstawie niewłaściwego zrozumienia: wydajesz się być pod wrażeniem, że GDB jest jakoś przechwytywania „wklej” wykonujesz, a nie dając znaki do odczytania przez program docelowy.

Jednak GDB jest nie przechwytując żadnych danych, do czasu, gdy jesteś zatrzymał przy zerwaniu (lub ze względu na sygnał). Podczas gdy twój program jest uruchomiony (i odczytuje dane wejściowe), samo GDB jest zablokowane (w wywołaniu systemowym waitpid), czekając, aż coś się stanie.

Co uniemożliwia otrzymanie przez program znaków kontrolnych? Twój emulator terminala to robi.

OK, w jaki sposób można ustawić wejście inne niż ASCII?Jeden z 3 sposoby (dwa są bardzo podobne)

  1. używają sygnałów z pliku
  2. używają sygnałów nazwanych rury
  3. zastosowanie gdbserver

Na Sposób nr 1:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/input 
gdb ./a.out 
(gdb) run < /tmp/input # voila: GDB reads terminal, 
         # your program reads /tmp/input 

Metoda nr 2:

mkfifo /tmp/pipe 
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/pipe & 
# perl will block, waiting for someone to read the pipe 
gdb ./a.out 
(gdb) run < /tmp/pipe 

Oba z powyższych metod będzie pracować dla „normalnych” programów (te, które czytają STDIN), ale nie powiedzie się w przypadku programów, które bezpośrednio (jak sudo, passwd, gpg) Czytaj terminal.

Sposób nr 3:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' | 
gdbserver :0 ./a.out # gdbserver will print a TCP port, e.g. 4321 
         # and stop the program at start 

# in another window, 
gdb ./a.out 
(gdb) target remote :4321 
# gdb will now attach to gdbserver, you can set breakpoints and continue. 
+0

Kocham cię! Dzięki! – Chris