问题标签 [buffer-overflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
12080 浏览

security - 用于简单堆栈溢出的 Shellcode:带有 shell 的被利用程序在 execve("/bin/sh") 之后直接终止

我在 Linux (amd64) 上玩过缓冲区溢出,并尝试利用一个简单的程序,但它失败了。我禁用了安全功能(使用 sysctl -w kernel.randomize_va_space=0 和 bios 中的 nx 位进行地址空间布局随机化)。它跳转到堆栈并执行 shellcode,但它不启动 shell。execve 系统调用成功,但之后它就终止了。知道有什么问题吗?独立运行 shellcode 就可以了。

额外的问题:为什么我需要在调用 printf 之前将 rax 设置为零?(见代码中的注释)

易受攻击的文件buffer.s

shellcode.s

利用.py

编译:

开始于:

使用 gdb 进行调试:

0 投票
5 回答
875 浏览

c - 如果有人抱怨gets(),为什么不对scanf("%s",...) 做同样的事情呢?

来自man gets

永远不要使用gets()。因为在事先不知道数据的情况下不可能知道gets()会读取多少个字符,并且因为gets()会继续存储超过缓冲区末尾的字符,所以使用起来非常危险。它已被用来破坏计算机安全。请改用 fgets()。

几乎在我看到scanf的所有地方都以应该有相同问题的方式使用(缓冲区溢出/缓冲区溢出scanf("%s",string):. 这种情况下存在这个问题吗?为什么手册页中没有关于它的引用scanf?为什么 gcc 在编译时不发出警告-Wall

ps:我知道有一种方法可以在格式字符串中指定字符串的最大长度scanf

编辑:我不是要确定前面的代码是否正确。我的问题是:如果scanf("%s",string)总是错误的,为什么没有警告并且手册页中没有任何关于它的内容?

0 投票
4 回答
146 浏览

c - ansi c意外行为的问题?

我正遭受意外行为的困扰;这是问题定义:

我有应用程序通过 UDP 协议在 LAN 上进行通信。我正在从文本文件中读取 IP 地址和端口号。最初,IP 地址和端口号运行良好,但一段时间后,存储在 char 数组中的 IP 地址已损坏,并且它采用垃圾值。此外,文件写入也受此影响。我的意思是 IP 数组中的值也写在由同一应用程序编写的文本文件中。我不明白是什么问题 - 你能帮忙吗?

0 投票
5 回答
842 浏览

c - 带有缓冲区溢出的代码示例(获取方法)。为什么它的行为不像预期的那样?

这是 ac 程序的摘录,应该演示缓冲区溢出。

问题是“用户最多可以输入多少个输入字符而不产生缓冲区溢出”

我最初的答案是 8,因为 char 数组有 8 个字节长。虽然我很确定我的答案是正确的,但我尝试了更多的字符,发现在出现分段错误之前我可以输入的字符数限制为 11。(我在 VirtualBox Ubuntu 上运行它)

所以我的问题是:为什么可以在 8 字节数组中输入 11 个字符?

0 投票
1 回答
1584 浏览

android - 非 HTC 设备的 AudioRecord 问题

我在使用 AudioRecord 时遇到问题。

使用从splmeter项目派生的一些代码的示例:

这在 HTC Dream 和 HTC Magic 上完美运行,没有任何日志警告/错误,但会导致模拟器和 Nexus One 设备出现问题。

在 Nexus 上,它根本不会返回有用的数据。我无法提供任何其他有用的信息,因为我有一个远程朋友进行测试。

在模拟器(Android 1.5、2.1 和 2.2)上,我从 AudioFlinger 和 AudioRecordThread 的缓冲区溢出中得到奇怪的错误。我的 UI 响应速度也大幅下降(即使录制发生在与 UI 不同的线程中)。

有什么明显的我做错了吗?我必须为 Nexus One 硬件做任何特别的事情吗?

编辑

我已经部分解决了这个问题...... AudioRecord的文档说:

返回成功创建 AudioRecord 对象所需的最小缓冲区大小。请注意,此大小并不能保证在负载下顺利录制,应根据 AudioRecord 实例轮询新数据的预期频率选择更高的值。对于新数据。

所以我将缓冲区长度更改为

现在模拟器运行良好。

硬件没有。虽然模拟器基于 8khz 从该调用返回 640 值(每秒进行 12.5 次轮询),但 HTC 硬件返回 4096!这意味着大约每秒 2 次轮询和半秒的音频延迟!此外,在 Nexus One 上的相同调用返回 8192!所以延迟了整整一秒!

我希望它就此结束,但是即使 HTC 设备和所有模拟器现在可以工作,nexus仍然没有返回任何音频(我自己仍然没有,所以我无法从其中获得正确的调试信息) (即使有些人比其他人更迟钝)。

我在这里做错了什么吗?

0 投票
4 回答
7948 浏览

c - 在 Mac os 10.6 上执行简单的缓冲区溢出

我正在尝试了解堆栈基溢出并编写一个简单的代码来利用堆栈。但不知何故,它根本不起作用,只在我的机器上显示中止陷阱(mac os leopard)

我猜Mac os对溢出的处理方式不同,它不允许我通过c代码覆盖内存。例如,

在 Linux 机器上,此代码成功覆盖下一个堆栈,但在 mac os 上阻止(中止陷阱)

有人知道如何在 mac 机器上执行简单的基于堆栈的溢出吗?

0 投票
3 回答
7791 浏览

assembly - 同一程序的汇编代码输出之间的差异

我一直在尝试从这篇文章aleph one复制缓冲区溢出示例 3

我正在这样做作为我正在参加的计算机安全课程中的一个项目的练习,所以我非常需要你的帮助。我一直在跟随这个例子,边做边执行任务。我的问题是我的计算机中转储的汇编代码gdb(我在 VM Ware 上运行的 debian linux 映像上执行此操作)与文章中的示例不同。有一些结构让我感到困惑。

这是我电脑上的一个: 替代文字

这是文章中的一个...

如您所见,两者之间存在差异。我很困惑,我无法完全理解我电脑上的汇编代码。我想知道两者之间的区别。

与,等pushl有何不同...pushmov vs movl

表达0xhexavalue(%register)是什么意思?

对不起,如果我问了很多,但我非常需要你的帮助。

更新:

为什么函数'function'的参数被翻译成不同的汇编代码:

从文章中,我相信函数的参数 1、2 和 3 被推入堆栈。

在我的电脑中,参数被移动到寄存器“esp”,并带有一些偏移量。

它们不同吗?谢谢

感谢您的帮助真的...

0 投票
3 回答
2248 浏览

c - 函数的返回地址与其假定值不同,缓冲区溢出,请帮助

今天是个好日子!

我试图了解缓冲区溢出是如何工作的。现在,我正在确定函数返回地址的地址,我应该更改它以执行缓冲区溢出攻击。我根据我在互联网上阅读的示例编写了一个简单的程序。这个程序所做的是它创建一个整数指针来存储函数的返回地址在堆栈中的地址。为此,(假设我了解函数/程序变量如何在堆栈中组织),我将 8 添加到缓冲区变量的地址并将其设置为 ret 的值。我在这里没有做任何会改变包含在 func 的返回地址位置中的地址的事情。

更新:我对程序进行了一些修改,所以它打印了 func 的参数 a 的堆栈地址。正如你所看到的,a 和 buffer 之间的距离大约是 8 个字节,所以这可能意味着,根据堆栈布局,保存的 FP 和旧的 EIP(func 返回地址)介于两者之间。我对吗?

这是程序:

执行时程序的输出:

替代文字 http://img20.imageshack.us/img20/2034/72783404.png

如您所见,我正在打印变量缓冲区和 ret 的地址。我添加了一条额外的语句,打印 ret 变量的值(假设 func 返回地址的位置,所以这应该打印下一条指令的地址,该指令将在 func 从执行返回后执行)。

这是转储,它显示了 func 返回后要执行的指令的假定地址。(绿色下划线)如您所见,该值与变量 ret 中包含的打印值完全不同。

替代文字 http://img717.imageshack.us/img717/8273/assemblycodecopy.png

我的问题是,为什么它们不同?(当然假设我所做的都是正确的)。否则,我做错了什么?我对程序运行时堆栈的理解是错误的吗?请帮助我理解这一点。我的项目将于下周到期,但我几乎没有碰过它。如果我要求很高,我很抱歉,我非常需要你的帮助。

0 投票
3 回答
5323 浏览

c++ - 使用 wcsncpy_s 复制字符串时缓冲区太小

这个 C++ 代码有点蹩脚,但我需要维护它。我似乎无法弄清楚“缓冲区太小”的问题。我正在使用 Visual Studio 2010。我将根据我在调试器中看到的值提出重现所需的最少代码。抱歉,我不会测试实际的代码段本身。此外,由于我的系统剪贴板在调试时“忙”,我不能只是复制和粘贴,所以一些错误可能会在某处蔓延,但我会仔细检查内容。相信我,你不想看到整个功能 - 太长了,没有任何意义 :)

来自 tchar.h

从 afxstr.h:

来自 WinNT.h:

哦,伙计,这些宏似乎永远不会结束。我会停在这里。最后,来自 myfile.cpp:

有了这个我打了一个断言,调试器tcsncpy_s.inl在最后打开以下代码:

调试器指向第 62 行:_RETURN_BUFFER_TOO_SMALL. 不幸的是,我无法在tcsncpy_s.inl. 也许有经验的编码员可以告诉我这里发生了什么?我相信(也许是错误的)这段代码已经很老了,并且没有考虑到 Unicode。解决这个问题的最佳方法是粘在旧的 N 支蹩脚的枪上(请不要使用 C++0X 技巧或其他花哨的东西)——我只想在子弹伤口上贴上补丁。

0 投票
7 回答
699 浏览

buffer - 什么是缓冲区?

就我对语言的理解而言,缓冲区是内存中存储数据的任何部分,例如 int、float 变量、字符数组等。但是,我正在阅读缓冲区溢出,并在阅读堆栈http时遇到了这个链接://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html 此链接中的图表将缓冲区与函数的局部变量分开。这个对吗?那么什么是缓冲区呢?