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