Strncat使用偏移量复制到目标

时间:2016-06-05 16:01:28

标签: assembly reverse-engineering exploit

所以我试图在strncat上反汇编这个简单的c程序,

 #include <string.h>

 int main(int argc, char **argv) {  
    char buf[128];
    strncat(buf,argv[1],sizeof(buf));    
   }

拆卸后

enter image description here

所以事情就是将argv 1中的字符串复制到[rbp-0x80] rsi有一个指向argv 1的指针,而rdi是[rbp-0x80]

在我的情况下,

[rbp-0x80]是0x7fffffffe0d0

这是我作为argv 1 perl -e 'print "B"x10;print "A"x118'

传递的输入

所以0x7fffffffe0d0 - 0x7fffffffe0da应该有4242 ... 但是有一个地址存储在0x7fffffffe0d5 - 0x7fffffffe0d0

这是调用strncat函数之前的屏幕截图 enter image description here

这是调用strncat函数后的屏幕截图 enter image description here

我不知道String为什么从0x7fffffffe0d6而不是0x7fffffffe0d0开始 enter image description here

有什么想法吗?

编辑:

输入屏幕截图 enter image description here

1 个答案:

答案 0 :(得分:4)

您没有初始化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)计数是它将从源读取的最大字符数,而不是dest缓冲区的大小。