使用GDB调试缓冲区溢出时无法识别栈中缓冲区起始位置
调试思路建议
输入方式排查
- 若程序是分两次输入(先用户名、后密码),shell的
$()会将换行符转为空格,导致输入格式错误。改用以下方式:- 写入输入文件:创建
input.txt,第一行写已知用户名,第二行写A序列,GDB中执行r < input.txt - 管道输入:
python -c "print('已知用户名\n'+'A'*20)" | gdb --args ./your_program - GDB内设置参数:
set args <(python -c "print('已知用户名\n'+'A'*20)")(部分shell支持)
- 写入输入文件:创建
断点有效性验证
- 直接针对输入函数设断点:若反汇编看到调用
scanf/fgets/read,执行b scanf/b fgets/b read,确保断在输入完成前 - 针对函数调用地址设断点:反汇编找到密码输入对应的
call指令地址(如call 0x123456),执行b *0x123456,强制断在调用位置
缓冲区位置定位
- 不要仅查看
$rsp:栈缓冲区通常在$rbp附近(栈向下增长),执行x/200xb $rbp-128(从rbp向下查128字节),逐步调整偏移量 - 使用GDB搜索功能:输入完成后,执行
search 0x41414141(连续4个A的十六进制值),让GDB自动定位内存中的A序列 - 先测试短序列:先用10个A输入,再查内存,更容易找到目标区域,避免长序列覆盖关键栈帧
输入逻辑额外排查
- 查看程序所有输入相关函数:执行
info functions,过滤read/scanf/fgets等函数,确认是否有非标准输入逻辑 - 检查输入是否被处理:若程序对输入做了转义/截断,可在输入函数返回后,查看寄存器(如
$rax/$rdi)中的输入缓冲区地址,直接查看该地址内存
内容的提问来源于stack exchange,提问作者rotkehlchen55
相关产品推荐
相关产品推荐

