c - 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
解决方案
推荐阅读
- javascript - 是否可以使用 javascript 更改 svg 图表的填充颜色?
- kubernetes - Kubernetes 外部名称服务
- vue.js - 如何测试嵌套的承诺存储操作
- c# - CommandInvokationFailure: 创建 assets.ap_ 包失败 详情请见控制台
- powershell - Powershell Forms - 用按钮暂停循环
- php - 存储过程不会从数据库中检索值并在 PHP 中显示输出
- ruby-on-rails - 示例帐户的种子
- oauth-2.0 - KeyCloak 中的自定义提供程序,可以根据用户名和密码进行身份验证
- c# - 如何在 xamarin 表单中更改设备语言
- vba - VBA 中的公式并在 VBA 中使用