GDB:更改堆栈内存中的字符串
GDB: Change string in memory on stack
我正在尝试通过 Capture-the-Flag 实时 VM,但在尝试使用 gdb 更改堆栈上传递的值(要推送的最后一项)时卡住了:
system("date");
到
system("ash");
到目前为止,我的 gdb 工作如下:
堆栈
我感兴趣的地址是堆栈中的最后一项(下面堆栈列表中的第一个)
(gdb) p $esp
= (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`4\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: "d40[=15=]4"
(gdb)
尝试改用 ASCII 值 - 未按计划进行。
感谢任何帮助 - 现在一直在挠我的(秃头)头......
谢谢
sc.
set *((const char *)0x080485ff) = "ash "
这是错误的:地址 0x080485ff
处的对象类型是 char[5]
,而不是 char*
。虽然前者可以转换为后者,但它们完全不一样。
set {const char [4] *}0x080485ff = "ash "
由于同样的原因,这是错误的:在地址 0x080485ff
.
处没有 指针
set {int}0x080485ff = 68736100
这个没有意义,因为 68736100
在十六进制中是 0x418d464
,在 ASCII 中是垃圾。你可能的意思是0x68736100
。
这实际上非常接近:
(gdb) x/s 0x080485ff
0x80485ff: ""
(gdb) x/s 0x080485ff+1
0x08048600: "ash"
问题是 0x68736100
是 "hsa[=23=]"
-- 你已经正确地交换了字符,但是你把终止符 NUL
放在了前面而不是后面。那么正确的调用是:
(gdb) set {int}0x080485ff = 0x687361
(gdb) c
Continuing.
sh: ash: command not found
成功了!
我正在尝试通过 Capture-the-Flag 实时 VM,但在尝试使用 gdb 更改堆栈上传递的值(要推送的最后一项)时卡住了:
system("date");
到
system("ash");
到目前为止,我的 gdb 工作如下:
堆栈
我感兴趣的地址是堆栈中的最后一项(下面堆栈列表中的第一个)
(gdb) p $esp
= (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`4\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: "d40[=15=]4"
(gdb)
尝试改用 ASCII 值 - 未按计划进行。
感谢任何帮助 - 现在一直在挠我的(秃头)头......
谢谢
sc.
set *((const char *)0x080485ff) = "ash "
这是错误的:地址 0x080485ff
处的对象类型是 char[5]
,而不是 char*
。虽然前者可以转换为后者,但它们完全不一样。
set {const char [4] *}0x080485ff = "ash "
由于同样的原因,这是错误的:在地址 0x080485ff
.
set {int}0x080485ff = 68736100
这个没有意义,因为 68736100
在十六进制中是 0x418d464
,在 ASCII 中是垃圾。你可能的意思是0x68736100
。
这实际上非常接近:
(gdb) x/s 0x080485ff
0x80485ff: ""
(gdb) x/s 0x080485ff+1
0x08048600: "ash"
问题是 0x68736100
是 "hsa[=23=]"
-- 你已经正确地交换了字符,但是你把终止符 NUL
放在了前面而不是后面。那么正确的调用是:
(gdb) set {int}0x080485ff = 0x687361
(gdb) c
Continuing.
sh: ash: command not found
成功了!