pwn-100(xctf)

本文详细介绍了如何利用xctf比赛中的pwn-100挑战,分析了程序的保护措施和流程,特别是在sub_40068E()调用sub_40063D()时出现的栈溢出漏洞。通过两种方法获取libc基地址,并针对x64架构的传参模式设计ROP链。尽管程序未提供system()和"/bin/sh",但通过DynELF和ROP技巧,最终实现了exploit的编写。
摘要由CSDN通过智能技术生成

0x0 程序保护和流程

保护:

在这里插入图片描述

流程:

main()

在这里插入图片描述

sub_40068E()

在这里插入图片描述

sub_40063D()

在这里插入图片描述

通过程序流程我们可以看出在sub_40068E()调用sub_40063D()时发生了栈溢出。

0x1 利用过程

1.这个程序没有system()函数,也没有"/bin/sh"。但是我们程序运行的时候需要libc。而libc中有我们需要的system(),所以我们只需要确定libc的基地址就可以知道system()。这里给出两种方法获取libc的基地址。第一种是pwntools自带的DynELF(leak,elf),但是这个只能寻找函数的地址不能寻找libc中的字符串。第二种是LibcSearcher模块。这里给出第一种方法

2.这个程序是x64它的传参模式跟x86不一样。x64是通过寄存器传参的。 x64中的前六个参数依次保存在RDI, RSI, RDX, RCX, R8和 R9中 。我们通过ROPgadget --binary 程序名 --only “pop|ret” 查找出二进制文件中的pop和ret指令的地址。

在这里插入图片描述

3.用DynELF时候没有"/bin/sh"。通过read/gets的方式读入。read函数有三个参数需要一个__libc_csu_init函数的通用gadget。gets函数直接用一个pop rdi ; ret就行了。

0x2 exp

DynELF

from pwn import *
elf=ELF('./a')
puts_plt=elf.plt['puts']
read_got=elf.got['read']
#context.log_level = 'debug'
pop_rdi=
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值