BUUCTF ez_pz_hackover_2016[动态调试之初入门]

本文介绍了如何使用动态调试解决BUUCTF ez_pz_hackover_2016挑战,通过分析32位程序的栈溢出漏洞,确定了利用栈地址、输入字符串位置和返回地址偏移量,展示了动态调试在栈题中的应用。
摘要由CSDN通过智能技术生成

BUUCTF ez_pz_hackover_2016[动态调试之初入门]

之前做题基本上都是放到IDA里面进行分析,所以在动态调试这方面一直有所欠缺,今天这道题就弥补了这个不足,真正地走进了栈题的动态调试
在这里插入图片描述
先check一下,发现什么保护都没有开,还是一个32位的程序,心里不免有些小激动,难道这题简单?
在这里插入图片描述
不管简单与否,我们都先运行一下,发现在输入之前回显给我们一个栈地址,并且这个地址不是固定的,所以这里一定会用到,拿小本本记下来,之后程序会将我们输入的东西打印出来
在这里插入图片描述
在这里插入图片描述
之后我们进到IDA来分析一下这个程序,发现关键函数一共有这两个 ,我们来看第二个vuln函数,会将最多0x400个字节赋值给dest,但是dest距离栈底只有0x32,所以存在栈溢出,但是具体的偏移量需要我们动态调试来确定
我们先确定我们输入的字符串在栈上的位置距离回显的地址
在这里插入图片描述
通过这个函数我们知道只有当我们输入crashme的时候才能够进入vuln函数,这也没有什么问题,在之后构造payload的时候我们只要用\x00将后面截断就可以了。
在这里插入图片描述

在vuln函数下断之后,我们观察一下此时的栈,crashme存放在0xffffcc00这个位置,一开始回显的位置是0xffffcc1c

在这里插入图片描述
也就是0x1c(28)个字节,所以我们的返回地址就清楚了,也就是减去28
之后我们来计算偏移量
在这里插入图片描述
在vuln函数里面有个nop段,在此之前$ebp的指针还没有变,所以我们在此处下一个断点

在这里插入图片描述

这个exp是借鉴网上的大神的,在这里附上链接

from pwn import *
from LibcSearcher import * 

local_file  = './ez_pz_hackover_2016'
local_libc  = '/usr/lib/x86_64-linux-gnu/libc-2.29.so'
remote_libc = './libc-2.23.so'
 
 
select = 0

if select == 0:
    r = process(local_file)
    #libc = ELF(local_libc)
else:
    r = remote('node3.buuoj.cn', 29689)
    libc = ELF(remote_libc)

elf = ELF(local_file)

context.log_level = 'debug'
context.arch = elf.arch

se      = lambda data               :r.send(data) 
sa      = lambda 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值