- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我从 Smashing the Stack for Fun and Profit 复制了示例 3在 Linux x86_64 上。但是我无法理解为了跳过指令应该增加到返回地址的正确字节数是多少:
0x0000000000400595 <+35>: movl $0x1,-0x4(%rbp)
这是我认为 x = 1
的地方指令是。我写了以下内容:
#include <stdio.h>
void fn(int a, int b, int c) {
char buf1[5];
char buf2[10];
int *ret;
ret = buf1 + 24;
(*ret) += 7;
}
int main() {
int x;
x = 0;
fn(1, 2, 3);
x = 1;
printf("%d\n", x);
}
并在 gdb 中对其进行反汇编。我已禁用地址随机化并使用 -fno-stack-protector
编译程序选项。
我可以从下面的反汇编程序输出中看到我想跳过地址 0x0000000000400595
处的指令: 来自 callq <fn>
的返回地址和 movl
的地址操作说明。因此,如果返回地址是 0x0000000000400595
, 下一条指令是 0x000000000040059c
, 我应该在返回地址上加 7 个字节吗?
0x0000000000400572 <+0>: push %rbp
0x0000000000400573 <+1>: mov %rsp,%rbp
0x0000000000400576 <+4>: sub $0x10,%rsp
0x000000000040057a <+8>: movl $0x0,-0x4(%rbp)
0x0000000000400581 <+15>: mov $0x3,%edx
0x0000000000400586 <+20>: mov $0x2,%esi
0x000000000040058b <+25>: mov $0x1,%edi
0x0000000000400590 <+30>: callq 0x40052d <fn>
0x0000000000400595 <+35>: movl $0x1,-0x4(%rbp)
0x000000000040059c <+42>: mov -0x4(%rbp),%eax
0x000000000040059f <+45>: mov %eax,%esi
0x00000000004005a1 <+47>: mov $0x40064a,%edi
0x00000000004005a6 <+52>: mov $0x0,%eax
0x00000000004005ab <+57>: callq 0x400410 <printf@plt>
0x00000000004005b0 <+62>: leaveq
0x00000000004005b1 <+63>: retq
我注意到我可以将 5 个字节添加到返回地址而不是 7 个字节并获得相同的结果。当我这样做时,我不是跳到指令的中间吗 0x0000000000400595 <+35>: movl $0x1,-0x4(%rbp)
?在这种情况下,为什么这不会使程序崩溃,例如当我向返回地址添加 6 个字节而不是 5 个字节或 7 个字节时。
Just before buffer1[] on the stack is SFP, and before it, the return address. That is 4 bytes pass the end of buffer1[]. But remember that buffer1[] is really 2 word so its 8 bytes long. So the return address is 12 bytes from the start of buffer1[].
在 Aleph 1 的示例中,他/她计算返回地址的偏移量为从 buffer1[] 开始的 12 个字节。因为我在 x86_64 上,而不是 x86_32,所以我需要重新计算返回地址的偏移量。在x86_64上,是不是buffer1[]还是2个字,也就是16个字节; SFP 和返回地址各为 8 个字节(因为我们使用的是 64 位),因此返回地址位于:buf1 + (8 * 2) + 8
相当于buf1 + 24
?
最佳答案
首先要注意的也是非常重要的一点:所有数字和偏移量都非常依赖于编译器。不同的编译器,甚至具有不同设置的同一个编译器,都可能产生截然不同的程序集。例如,许多编译器可以(并且将会)删除 buf2
,因为它未被使用。他们还可以删除 x = 0
,因为它的效果未被使用,稍后会被覆盖。他们还可以删除 x = 1
并将所有出现的 x
替换为常量 1
,等等。
也就是说,您绝对需要为您在特定编译器及其设置上获得的特定程序集编号。
问题 1由于您为 main()
提供了程序集,我可以确认您需要向返回地址添加 7 个字节,通常为 0x0000000000400595
,以跳过 x=1
并转到 0x000000000040059c
,它将 x
加载到寄存器中供以后使用。 0x000000000040059c - 0x0000000000400595 = 7
。
问题 2仅添加 5 个字节而不是 7 个字节确实会跳转到指令的中间。然而,这个 2 字节的指令尾恰好(纯属偶然)是另一个有效的指令代码。这就是它不会崩溃的原因。
问题 3这又非常依赖于编译器和设置。几乎所有事情都可能在那里发生。由于你们没有提供反汇编,所以我只能猜测。猜测如下:buf
和 buf2
向上舍入到下一个堆栈单元边界(x64 上为 8 个字节)。 buf
变成8字节,buf2
变成16字节。帧指针不会保存到 x64 上的堆栈,因此没有“SFP”。总共 24 个字节。
关于c - 粉碎堆栈 example3 ala Aleph One,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598828/
是否可以让类型成为类型类的一部分?像这样的东西: class KeyTraits v where keyType :: * key :: v -> keyType data Table
有谁知道如何在 Assets 库中重新排序 Assets ? ALAsset 是否有类似 order 属性的东西,我可以使用它来更改 Assets 的顺序?枚举 Assets 时的默认顺序是什么? 最
我有一个关于像 Reddit 这样的书签网站如何管理用户记录的所有“投票”的问题。 例如,当我(User_ID_292929)逻辑上对数据库中的某个帖子(Post_ID_282828)进行投票时,它表
最近我一直需要实现生成一堆数字的小类。如果 C++ 有像 python 这样的生成器,那将是非常方便的,但不幸的是,事实并非如此。 所以我一直在思考如何最好地实现这些类型的对象,以便于迭代和组合。当我
我正在尝试在我的 Windows 7 机器上安装 Insight Debugger,但没有成功。 我安装了 cygwin 完整包,并下载了 insight 的源代码。我正在按照 this tutori
Java 语法中有一部分让我很烦:那就是花括号和分号。是否存在某种允许我使用除此之外的所有 Java 语法的翻译器?我想做这样的事情: public class Hello: public s
在 MATLAB 中可以创建 function handles用类似的东西 myfun=@(arglist)body 这样您就可以随时随地创建函数,而无需创建 M 文件。 在 Python 中是否有一
在 ruby 中你可以去 a = { } a['a'] = 82 a['b'] = 'foo' puts a['a'] # 82 我希望我可以使用点符号,例如 javascript。 将 a.a #
不确定标题是否适合这个问题,但我想不出任何其他方式来表达它.. 假设您想创建多个不同的 Web 应用程序,但您希望已登录一个应用程序的用户无需重新登录即可直接访问您的另一个应用程序(假设他们也有查看其
我想采用几个简单的关系数据库并将它们切换为使用 Azure 表存储,而不是简单地将它们放入 SQLAzure。我总是使用 ORM 生成的代码来访问我的数据库(在本例中为 LLBLgenpro)。是否有
我喜欢 StackOverflow 处理标签的方式。是否有任何 jQuery 插件可以重复该行为? 我找到了这个jQuery Tag Suggest但它还没有那么好。 有什么建议吗? 最佳答案 jQu
我最近花了一些时间玩了一个名为 Draw Something(Android,iOS)的游戏。我喜欢这样的方式,一个玩家可以在屏幕上绘图,然后为第二个玩家重新创建绘图。我想在我的网站上使用类似的东西,
如何模仿 Apple.com 的介绍动画,该动画首先用于更新后的 MacBook Air,目前用于 iPad 2? 最佳答案 我会做以下事情: 创建网站,一切正常显示 将 display: hidde
关于如何向下移动像顶部的苹果栏这样的 div 有什么想法吗? (jQuery 或其他库?) 示例:http://www.apple.com/ipad/guided-tours/ 最佳答案 Apple
关于 SortedMap.subMap 这是 SortedMap.subMap 的 API : SortedMap subMap(K fromKey, K toKey) : Returns a vie
我是第一次使用该引擎,对 iOS 开发还很陌生。我很好奇是否有办法在我登录成功后调用函数?我似乎无法让它按照 FBConnect 在初始登录功能后调用 fbDidLogin 的方式工作。我声明了 MG
在我正在处理的电影数据库项目中,每个用户都有一个事件提要。我想将类似的事件归为一组,例如 Facebook 的做法,但略有不同。 例如,如果用户为一部电影写了评论,一分钟后他也为该电影投票,5 分钟后
有人知道在 javascript 中执行矩阵指数的现有代码吗? 或者,如果没有,编写类似内容的“最佳实践”是什么?我已经习惯了 C++ 和 Matlab,最近几天只是尝试着破解一些 WebGL 的东西
我有四组数据: A=range(10,20) B=range(5,17) C=range(15,25) D=range(18,30) sets = [A, B, C, D] 我想做的是获取交集的内容被
这可能是一个毛茸茸的问题,但是。说我有 Followers: -user_id -follower_id Activities: -id -user_id -activity_type -node_i
我是一名优秀的程序员,十分优秀!