- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在编写一个 shellcode,该代码利用使用 puts
函数的目标程序。该程序如下所示:
#include <stdio.h>
main() {
char buf[123];
puts(gets(buf));
}
我想要做的是溢出这个缓冲区并使用一些参数调用execve
。我有一个用 c/inline assembly 编写的测试程序,可以使用一些参数调用 execve,然后我使用 gdb 从该程序获取 shellcode。根据我的理解,堆栈布局如下所示:
|-------buffer(+padding)---------|---------sfp---------|-------ret-------------|
通过查看gcc生成的目标程序的部分汇编代码:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
addq $-128, %rsp
leaq -128(%rbp), %rax
movq %rax, %rdi
call gets
movq %rax, %rdi
call puts
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
我认为缓冲区和填充占用128字节,sfp和返回地址各占用8字节,所以总共144字节。基于此,我的 nop sled 、有效负载和新的返回地址(等于缓冲区的地址)组合(即我的 shellcode)也应该是 144 字节。例如,如果我的有效负载是 36 字节,由于返回地址占用 8 字节,所以我的 nop sled 将是 100 字节。但当我这样做时,它不起作用。所以我想也许我理解堆栈布局的方式是错误的。是不是搞错了?
请注意,在我的例子中,缓冲区地址是已知的,并且使用 execstack
将堆栈设置为可执行文件,并且使用 setarch
关闭了 ASLR。因此,如果返回地址被缓冲区的地址覆盖,则写入该缓冲区的代码将运行。
我正在 x86 64 位机器上工作。
如果我对堆栈布局的理解是正确的,我将提供有关我的 shellcode 的更多信息。
最佳答案
1) 您没有利用易受攻击的代码,因为它具有 puts()
函数,您之所以利用它,是因为它使用的是易受攻击的 gets()
函数此处堆栈溢出。
2) 当你有一个字符buf[123]
时,如果你输入122个字符,然后输入一个空终止符,堆栈就可以了。但是当您输入的内容超过这个数量时,就会发生以下情况:
让我们假设它是 buf[4],当你执行 gets() 时
input AAAA
EBP - 4 => will be AAAA
input AAAAAAAA (8 bytes)
EBP -4 => AAAA
EBP also => AAAA
if you enter 12x A
function return address will be 0x41414141
现在您还将覆盖函数返回地址,因此它也将是 AAAA 0x41414141!从那里您需要将返回地址指向您的 shellcode 地址才能执行 shellcode。
所以当调用函数和溢出时,布局是:
Buffer for temporary storage
local variables
The saved EBP
Function return address
Function's arguments
Stack frame
所以是从下到上。实际上对于大变量最好使用metasploit pattern_offset.rb
,它会生成大字符串,当你找到EIP值时,你可以使用patter_offset.rb
的输出来检测覆盖 EIP 所需的精确填充才能执行 shellcode。
所以实际上要覆盖函数返回地址,大多数情况下需要[变量大小] + 8。但这取决于局部变量、它们的大小、它们的顺序等。还取决于编译器、体系结构等。大多数情况下是通过尝试和pattern_offset.rb等完成
关于assembly - 编写 shellcode : why my shellcode won't work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531877/
关闭。这个问题是off-topic .它目前不接受答案。 想要改进这个问题? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正在在线开发哈佛 CS50 的 PSET3,并且在 CS50 十五场游戏的“获胜”功能方面遇到问题。 该函数适用于 4x4 网格拼图,但不适用于 3x3 对于 3x3 的情况,该函数返回 true
我在 pset 的最后一部分,每当我使用 ./fifteen 3 #include #include #include // b
我正在学习 Javascript 并开始了第一个游戏元素:井字游戏。 我的元素及其代码: Tic Tac Toe Project 如果用户在井字游戏中获胜,我希望能够显示通知。 现在我只想测试我的“获
我刚刚将 MAMP 3 升级到 MAMP 4,而 MySQL 不再启动。 错误日志文件一遍又一遍地写着: 160905 11:22:17 mysqld_safe mysqld restarted 20
我目前正在构建一款非常流行的 Tic-Tac-Toe 游戏的复制品,该游戏使用纯 ruby 构建并经过测试的 TDD 风格。 我遇到的唯一问题是,在我的一生中,我无法弄清楚如何检查玩家何时获胜。我知道
我想构建 OSX 小部件以快速制作基于流数据的可视化仪表板组件的原型(prototype)。我想使用 d3.js 来进行显示,但是我尝试的最基本的事情都遇到了错误,我没有能力/耐心去解析。 在我开始在
我正在尝试在 android 中制作谷歌地图应用程序。我在 SDK 管理器中安装了 Google Play 服务。当我运行该应用程序时,模拟器中出现错误文本: App won't run unless
我的模拟器有问题,它不想启动,它阻止了加载屏幕。 最佳答案 我也遇到了这个问题,解决方法是打开模拟器,然后在顶部菜单中:Simulator > Reset content and setting。 关
我知道我需要一个 target="_blank,但它在我放置它的任何地方都不起作用。请帮忙! 最佳答案 你可以试试这个... 关于javascript - 添加目标 ="_blank to my
我正在用 PHP 使用 mySQL 编写一个模拟选举的网络应用程序。 我有三个表:Candidates、Elections 和 Votes。 Votes 包含 CandidateID、Election
在David Beazley's talk on generators ,他说,作为一个警告: Functions that consume an entire iterable won't term
我正在通过 Android Studio 使用 Android 模拟器来实现一个使用 Google map 的应用程序,但是当我运行该应用程序时,我在模拟器屏幕上收到以下消息: “如果您的设备不支持
我正在 Salesforce 中创建 DocuSign 自定义按钮。在运行 DocuSign 按钮逻辑之前尝试在某些字段值不满足时添加错误。 我想要的条件是,如果机会阶段的选择列表值不等于“已关闭”,
我正在尝试使用 BaseGameUtils 将游戏集成到我的应用程序中。一切看起来都很好,但是当我运行该应用程序时,我收到消息“在您更新 Google Play 服务之前,此应用程序不会运行”,当我单
我正在开发的网站上使用 jplayer html5 媒体播放器,但它无法在 Chrome 上播放某些 mp3。我试过在浏览器的 native 播放器中播放这些 mp3,但两者都无法播放。另一方面,当我
在 Programming Rust 一书中的 References Are Never 部分,他们指出没有与 C 的 NULL 类似的东西。那一点我明白了。然后他们说 Rust won't conv
Auto-Scaling 下的 EC2 可能由于内存问题而无法扩展。我的自动缩放设置会检查 CPU,因为默认情况下无法将内存添加到 cloudwatch 指标中。有什么建议可以让我的服务器在上述情况下
每当我启动 Azure Cloud Shell 时,都会收到此错误: 无法装载 azure 文件共享。您的云驱动器将不可用您的 Cloud Shell session 将是短暂的,因此任何文件或系统更
我在 UITableViewCell 中有一个灵活的可编辑 UITextView。一个简单项目的完整源代码可以在 https://github.com/AlexChekanov/TextViewInT
我是一名优秀的程序员,十分优秀!