- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在问题之前,这纯粹是为了作业,否则我不打算错误地访问不安全的程序。
我有一个涉及溢出输入字符串的作业,以便 ret
指令将我发送到我想去的某个地址。该字符串预计最多 32 个字节,所以如果我用 32 个字节的垃圾填充它,然后是另外 4 个字节的垃圾,然后是我想要访问的 4 个字节的地址,那么我已经操纵程序调用了错误的函数。我在 32 之后填充 4 个字节的垃圾的原因是因为溢出字符串的函数这样结束:
8048bc9: e8 3c ff ff ff call 8048b0a <Gets>
8048bce: b8 01 00 00 00 mov $0x1,%eax
8048bd3: c9 leave
8048bd4: c3 ret
<Gets>
是填充字符串的内容。如果我理解正确的话,4 个字节的垃圾在 %ebp
期间被弹出到 leave
中,然后我的 4 个字节由 ret
执行,基本上作为跳转到我想去的函数。
这足以解决简单的问题,但在某些情况下,我应该在使用 ret
跳到我想要的地方之前执行额外的代码。我对 ret
的理解不够好,无法做到这一点。如果我想说将 %eax
设置为某个值(例如 0x12345678),这怎么可能来自仍然必须跳转到错误函数的 ret
指令?
如果重要的话,这将以 32 位运行。我在问如何做额外的指令,因为第一个问题有不变的地址,但后面的问题有添加了随机值的地址。
最佳答案
正如 harold 提到的,解决方案是让返回函数将我发送到字符串缓冲区的开头。
这可以通过用 40 个字节(这是 32 位 x86)溢出字符串缓冲区来完成,这样前 32 个字节在字符串缓冲区中,4 个由 leave
指令弹出,并且最后 4 个由 ret
指令执行。目标是使最后 4 个字节成为我的字符串缓冲区的地址,采用小端格式。在 ret
指令执行完这 4 个字节后,我的机器代码开始从字符串缓冲区的开头执行。
关于x86 - 使用输入字符串和 ret 进行溢出攻击,x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15859187/
有什么区别: 1) !ret 2) ret != 0 ? if (ret != 0 || stack[fd] == NULL || stack[fd][0] == '\0') { if (!ret
我正在使用 java 客户端 (jrets) 来查询 RETS 服务器。此 rets 服务器不支持 OFFSET 功能。 服务器管理员告诉我使用 MODIFIED 字段作为翻阅记录的一种方式。但是,我
我想从 RETS 服务器下载所有属性(property) list ,包括所有照片 URL。我正在使用 DMQL2 和 PHRETS 库。属性和照片对象存储在 RETS 服务器的不同表中。 要获取所有
各位, 我将使用 RETS 进行真实项目。我有一份文件,说明我的经理实际上在寻找什么。但我真的不知道如何开始使用 RETS MLS,因为它有很多这样的文档。 通过一些研发,我几乎没有想出任何有值(va
我正在尝试在 Microsoft visual studio 2013 on C++ 上编译一个为 linux 编写的程序(是 C 和 C++ 的混合体 (#include .h),我将全部转换为 C
当我尝试像这样编写自己的decay_t时: #include template struct auto_decay { auto operator () () noexcept {
我经常看到通过测试小于零而不是显式定义来检查 POSIX 函数错误的代码,通常唯一的错误代码使用 -1。也就是 ret = function(); if (ret < 0) { ... } 对
考虑以下空 C 程序(标准保证编译器执行隐式 return 0): int main(int argc, char* argv[]) {} 您可以将任何逻辑添加到此函数中来操作 argc 和 argv
我在 ubuntu 12.04 和 auctex 11.86 上运行 emacs 23.3.1。每当我去编译 latex 文档(使用 C-c C-c)时,如果没有错误,一切都编译得很好。但是,如果有任
我有 RETS 元数据文件,我想将其转换为数据库模式,这样我就可以查询我的数据库而不是 RETS 服务器。 有谁知道可以使用 xml 并将其转换为数据库模式的工具?或者可能是数据库模式本身? 一切都包
由于 ret 指令是一个间接调用,x86 上的 ret 指令会停止流水线,还是以某种方式优化为更直接的调用? 最佳答案 根据英特尔优化引用手册,分支预测单元包含一个 Return Stack Buff
我有以下头文件: #include #include #include #include #include #include /** **/ // size: 1B typedef en
我目前正在开发一个网站并从 RETS(房地产交易标准)API 中提取列表。我的一切工作正常,但我的问题是在尝试深入挖掘查询时出现的。作为引用,我正在使用 Node RETS Client但我不确定它与
if(isset($_POST['update'])) { $rets_login_url = $Fetch['rets_url']; $rets_username = $Fetch['rets_us
我有这个函数,它主要由内联汇编码成。 long *toarrayl(int members, ...){ __asm{ push esp mov eax, me
int suma(int* array, int len) { asm(" xor %eax, %eax # resultado = 0 \n"
我对汇编很陌生,我不明白在 proc 结束时你用 ret 写一个数字的确切含义是什么。陈述。 像这样: Function Proc push ax cx . ...body... . pop cx a
我正在尝试使用 PHRETS 从 rets 服务器在 WordPress 中添加帖子。不幸的是,正在添加重复的帖子。我已使用 WP 查询使用元键和值检查现有帖子。当我尝试添加 10 或 50 个帖子时
我有以下程序: SECTION .text main: mov ebx, 10 mov ecx, 50 repeat: inc ebx loop repeat
假设我正在 x86 汇编中编写一个例程,例如“add”,它将两个作为参数传递的数字相加。 在大多数情况下,这是一个非常简单的方法: push ebp mov ebp, esp mov eax, [eb
我是一名优秀的程序员,十分优秀!