所以我试图在strncat上反汇编这个简单的c程序,
#include <string.h>
int main(int argc, char **argv) {
char buf[128];
strncat(buf,argv[1],sizeof(buf));
}
拆卸后
所以事情就是将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
我不知道String为什么从0x7fffffffe0d6而不是0x7fffffffe0d0开始
有什么想法吗?
编辑:
答案 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缓冲区的大小。