2013-03-25 221 views
8

我在一個軟件安全類中,目前我們正在學習緩衝區溢出以及它們如何被利用。我有一個程序,我知道如何利用,但我似乎無法這樣做,因爲我必須寫十六進制,它不允許我寫。在GDB中寫入十六進制

我需要編寫從生成的數據:

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

然而,因爲在程序運行交互式我不能重定向輸出到命令行參數。從歷史上看,我使用xclip將其複製到剪貼板,然後將其粘貼到正在運行的應用程序中,但出於某種原因,這個十六進制序列不允許我使用xclip來複制它(它顯示爲沒有被複制)。

例如:

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

如果我按ctrl後+ V,沒有獲取粘貼。如果我只是從終端窗口複製粘貼輸出,粘貼錯誤的十六進制(我假設這是因爲十六進制不可見ASCII)。

我的問題是:GDB有一些方法可以讓我將這樣的生成文本插入交互式運行程序嗎?

我知道,如果利用的程序了命令行參數,我可以這樣做:

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

但由於它不通過CLI參數運行,這是不可用的。

任何幫助將會很棒!

+0

您可以重定向標準輸入來自文件或管道讀取。 – 2013-03-25 22:50:08

+0

我該怎麼做,並同時運行帶有斷點的GDB?我知道我可以做「perl -e ... | ./program」,但是這不會啓動帶有斷點的gdb。 「perl -e ... | gdb ./program」啓動gdb,但不運行程序或使用斷點。 – Chris 2013-03-25 23:07:40

+0

你可以從鍵盤輸入... http://superuser.com/questions/59418/how-to-type-special-characters-in-linux – 2013-03-26 03:16:33

回答

19

我的問題是:GDB是否有一些方法可以讓我將這樣的生成文本插入交互式運行程序中?

你的問題是基於誤解:你似乎覺得GDB以某種方式攔截你正在執行的「粘貼」,並且不讓目標程序讀取字符。

然而,GDB是攔截任何輸入,直至及除非你是在斷點處停止(或因信號)。所以,當你的程序正在運行(並讀取輸入)時,GDB本身被阻塞(在waitpid系統調用中)等待發生。

那麼是什麼阻止你的程序接收控制字符?您的終端模擬器可以。

好的,你如何安排非ASCII輸入?之一的3種方式(兩者是非常相似的):從文件

  1. 使用輸入
  2. 從命名管道
  3. 使用輸入
  4. 使用gdbserver的

對於方法#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 

方法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 

上述兩種方法都適用於「正常」程序(讀取STDIN),但對於直接讀取終端的程序(如sudo,passwd,gpg)將失敗。

方法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

我愛你!謝謝! – Chris 2013-03-26 04:46:08