【发布时间】:2016-06-05 16:01:28
【问题描述】:
所以我试图在 strncat 上反汇编这个简单的 c 程序,
#include <string.h>
int main(int argc, char **argv) {
char buf[128];
strncat(buf,argv[1],sizeof(buf));
}
拆开后
所以问题是 argv1 中的字符串将被复制到 [rbp-0x80] rsi 有一个指向 argv1 的指针,而 rdi 是 [rbp-0x80]
[rbp-0x80] 在我的例子中是 0x7ffffffffe0d0
这是我作为 argv1 perl -e 'print "B"x10;print "A"x118' 传递的输入
所以 0x7ffffffffe0d0 - 0x7ffffffffe0da 应该有 4242... 但是有一个地址存储在 0x7ffffffffe0d5 - 0x7ffffffffe0d0
我不明白为什么字符串从 0x7ffffffffe0d6 而不是 0x7ffffffffe0d0 开始
有什么想法吗?
编辑:
【问题讨论】:
-
@PeterCordes 这就是我的想法,所以我使用 printf 打印了字符串 对于输入字符串 hello 我正在获取 Hello 作为输出,如果我有 `perl -e 'print"A"x15' 我得到15 A 但在 16 之后我得到 ����AAAAAAAAAAAAAAAA 有什么想法吗?我会用屏幕截图更新问题。
-
所以您实际上是在使用
AAAAAAAAAAAAAAAA...作为参数,而不是perl -e 'print...?即您使用的是 perl 命令的输出,而不是您的问题所说的 perl 命令的文本?反引号是code的 stackoverflow 降价。你应该说你使用$(perl -e ...)作为参数。 -
但无论如何,
buf开头附近的非 ascii 垃圾正是您的 gdb 转储显示的内容。为什么这令人惊讶?如果您转储为字节大小的块而不是单词(因为 x86 是 little-endian),那么它会更容易阅读。每个 32 位十六进制值的最后一个(最低有效)字节是内存顺序中的第一个字节。 -
@PeterCordes perl -e 'print "A"x10' 产生 10 A ,只是为了方便:) 只是想知道为什么对于字符串 Hello (并且输入小于 16byte )输出没有垃圾
-
gcc 发出保持堆栈 16B 对齐的代码。可能更长的 arg 字符串会在堆栈上占用更多空间,这就是
rsp在main内下降 16B 的阈值。所以buf[]有不同的未初始化垃圾。
标签: assembly reverse-engineering exploit