2017-02-11 66 views
3

我試圖通過Capture-the-Flag實時虛擬機,並在嘗試使用gdb更改堆棧上傳遞的值時卡住(最後一項是推):GDB:更改堆棧上內存中的字符串

system("date"); 

system("ash"); 

到目前爲止,我的GDB的努力是如下:

我感興趣的地址是堆棧(第一次在下面的堆棧列表)上的最後一個項目

(gdb) p $esp 
$1 = (void *) 0xbf902690 

(gdb) x/32w 0xbf902690 
0xbf902690: 0x080485ff 0x0000044c 0xb7783ff4 0xbf9026b8 
0xbf9026a0: 0xb76a8fa9 0xb7797356 0x08048529 0x0000044c 
0xbf9026b0: 0x08048520 0x08048410 0xbf902728 0xb7695cf7 
0xbf9026c0: 0x00000001 0xbf902754 0xbf90275c 0xbf9026e4 
.... 
(gdb) x/s 0x080485ff 
0x80485ff: "date" 
(gdb) x/s *0x080485ff 
0x65746164: <Address 0x65746164 out of bounds> 
(gdb) 

試圖改變內存1

(gdb) set {const char [4] *}0x080485ff = "ash " 
(gdb) x/s 0x080485ff 
0x80485ff: "\b`\354\b" 
(gdb) 

正如你所看到的,我把指針弄亂了。

試圖改變內存2

(gdb) set *((const char *)0x080485ff) = "ash " 
(gdb) x/s 0x080485ff 
0x80485ff: "\bate" 
(gdb) 

更忙玲 - 事做提領錯?

試圖改變存儲3

(gdb) set {int}0x080485ff = 68736100 
(gdb) x/s 0x080485ff 
0x80485ff: "d\324\030\004" 
(gdb) 

嘗試使用ASCII值而不是 - 按照計劃不奏效。

任何幫助表示讚賞 - 被抓我的(禿),頭現在一段時間...

感謝

SC。

回答

3

set *((const char *)0x080485ff) = "ash "

這是錯誤的:對象的地址0x080485ff類型是char[5],不是char*。雖然前者可以投給後者,但它們並不完全相同。

set {const char [4] *}0x080485ff = "ash "

這是錯誤的,同樣的原因:有地址0x080485ff沒有指針

set {int}0x080485ff = 68736100

這一個是沒有意義的,因爲687361000x418d464十六進制和垃圾ASCII。你大概意思是0x68736100

這實際上是非常接近:

(gdb) x/s 0x080485ff 
    0x80485ff: "" 
    (gdb) x/s 0x080485ff+1 
    0x08048600: "ash" 

的問題是,0x68736100"hsa\0" - 你已經正確地交換了角色,但你已經把終止NUL在前面而不是後面。正確的調用是:

(gdb) set {int}0x080485ff = 0x687361 
(gdb) c 
Continuing. 
sh: ash: command not found 

它的工作!

+0

謝謝你好先生!這確實是我需要做的 - 你的解釋非常感謝。關於十六進制,我沒有簡單地假設右值可以以0x開頭。衛生署。再次感謝。 – swisscheese