【问题标题】:GDB: Change string in memory on stackGDB:在堆栈上更改内存中的字符串
【发布时间】: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.

【问题讨论】:

    标签: gdb exploit internals


    【解决方案1】:

    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\0"——你已经正确地交换了字符,但是你把终止符NUL 放在前面而不是后面。那么正确的调用是:

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

    成功了!

    【讨论】:

    • 谢谢您的好先生!这确实是我需要做的——非常感谢您的解释。关于十六进制,我未能简单地假设右值可以以 0x 开头。多哈。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 2011-06-25
    • 2012-04-17
    • 2018-09-22
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多