【发布时间】:2017-02-11 16:13:06
【问题描述】:
我正在尝试通过 Capture-the-Flag 实时 VM,并在尝试使用 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.
【问题讨论】: