首页 > 解决方案 > sprintf - 堆栈关系 - bufferoverflow

问题描述

对于这种缓冲区溢出sprintf情况,可以放入堆栈的最大值是多少, 因为我注意到正常情况下将允许更多值printf(string)

当传递一个值 > ( "%1500d") 会发生错误,传递一个值 > 比前一个值 ( "%50000d") 会发生另一个错误

那么它和堆栈之间的确切关系是什么?

在运行文件时传递更多空argv参数时,它允许更多填充值

这是为什么?


编译运行

gcc code.c -o code 
./code "%1500d"
void vuln(char *string)
{
char buffer[64];
sprintf(buffer, string);
}
int main(int argc, char **argv)
{
  vuln(argv[1]);
}

数据库

"%1500d"错误

=> 0x7ffff7a9c57b <__mempcpy_sse2+331>: rep movs QWORD PTR es:[rdi],QWORD PTR ds:[rsi]
Stopped reason: SIGSEGV
__mempcpy_sse2 () at ../sysdeps/x86_64/memcpy.S:272
272 ../sysdeps/x86_64/memcpy.S: No such file or directory.

"%50000d"错误

=> 0x7ffff7a8868b <__GI__IO_default_xsputn+75>: mov    BYTE PTR [rdi+rax*1],dl
Stopped reason: SIGSEGV
0x00007ffff7a8868b in __GI__IO_default_xsputn (f=0x7fffffffe1a0,
    data=<optimized out>, n=0x10) at genops.c:450
450 genops.c: No such file or directory

标签: csecurityprintfbuffer-overflowexploit

解决方案


推荐阅读