gpt4 book ai didi

GDB:更改堆栈内存中的字符串

转载 作者:行者123 更新时间:2023-12-01 23:12:28 25 4
gpt4 key购买 nike

我正在尝试通过 Capture-the-Flag 实时虚拟机,但在尝试使用 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。

最佳答案

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

成功了!

关于GDB:更改堆栈内存中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42178115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com