【问题标题】:Strncat copied to the destination with an offsetstrncat 用偏移量复制到目的地
【发布时间】: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

这是调用 strncat 函数之前的屏幕截图

这是调用strncat函数后的截图

我不明白为什么字符串从 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 字符串会在堆栈上占用更多空间,这就是 rspmain 内下降 16B 的阈值。所以buf[] 有不同的未初始化垃圾。

标签: assembly reverse-engineering exploit


【解决方案1】:

你没有初始化buf[],而里面的未初始化垃圾恰好不是以0开头的。您使用了strncat,而不是strncpy,因此它会查找现有字符串的开头。幸运的是,缓冲区的开头附近有一个零,因此您实际上不会溢出它。 (这是可能的,因为您使用了strncat 错误)。

令人惊讶的是,gcc 和 clang 都没有足够了解 strncat 来警告读取未初始化的数据。 clang-3.8 does warn that you got the size wrong

strncat doesn't include the terminating 0 in the count, but it always writes one(不同于strncpy)。而且计数也不包括strlen(dst)计数是将从源读取的最大字符数,而不是目标缓冲区的大小。

【讨论】:

  • 是的,这就是问题:D,在调用 strncat 之前, 0x7ffffffffe0d0 有 7ffffffffe250 以空字符结尾,所以它被附加到它上面。现在的问题是在正常运行时,即 ./a.out hello ,当我使用 gdb 运行它时,我得到了 hello,我得到了垃圾值 o.O
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2014-10-27
  • 2021-05-18
相关资源
最近更新 更多