栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

当在管道中放置特定的字符串时,如何监视放入标准输出缓冲区的内容并中断?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

当在管道中放置特定的字符串时,如何监视放入标准输出缓冲区的内容并中断?

这个问题可能是一个很好的起点:如何在gdb中的“将某些内容打印到终端”上设置断点?

因此,无论何时将任何内容写入标准输出,您都至少可以中断。该方法主要涉及

write
在第一个参数为
1
(即STDOUT)的条件下在syscall上设置断点。在注释中,还提示您如何检查
write
调用的字符串参数。

x86 32位模式

我提出了以下内容,并使用gdb 7.0.1-debian对其进行了测试。看来效果很好。

$esp +8
包含指向传递给字符串的内存位置的指针
write
,因此首先将其转换为整数,然后转换为的指针
char
$esp +4
包含要写入的文件描述符(对于STDOUT为1)。

$ gdb break write if 1 == *(int*)($esp + 4) && strcmp((char*)*(int*)($esp + 8), "your string") == 0

x86 64位模式

如果您的进程以x86-64模式运行,则参数将通过暂存器传递,

%rdi
并且
%rsi

$ gdb break write if 1 == $rdi && strcmp((char*)($rsi), "your string") == 0

请注意,由于我们使用暂存器而不是堆栈中的变量,因此删除了一层间接。

变体

strcmp
以上代码段中可以使用的功能除外:

  • strncmp
    如果您想匹配
    n
    所写字符串的第一个字符数,则很有用
  • strstr
    可用于查找字符串中的匹配项,因为您始终不能确定要查找的字符串位于通过函数写入的字符串的 开头
    write

编辑: 我喜欢这个问题,并找到它的后续答案。我决定写一篇关于它的博客文章。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/399151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号