pwn -- pwnable.kr -- simple-login---学习stack pivot

在看关于pwn的书时学到了 栈帧劫持stack pivot 利用这个例题练习一下。
基本思想:
stack pivot利用到的gadget是在函数退出时需要的两条指令:leave(mov esp,ebp;pop ebp);ret;。这两条指令基本都会有。
可以利用这两条指令,通过栈溢出的方式,实现可以完全控制栈。

stack pivot实现的基本方法

(我的理解

  1. 通过栈溢出的方式将 我们之后要实现的完全可控的栈的地址写到EBP的地方
  2. 写入之后 ,程序第一次leave;ret;,将写入的地址赋给esp。
    写入地址及第一次leave 图解:
    在这里插入图片描述

此时 ebp的值 变成了我们写入的地址,指向了新栈,esp还是在原来的栈上。
3. 之后执行ret,程序继续按原来的执行。继续执行,执行到下一个leave;ret的时候,esp也指向了新的栈上,此时就得到了一个完全可控的栈
图解:
在这里插入图片描述
进而就可以控制新栈的eip

分析例题:

  1. 执行文件
    在这里插入图片描述

  2. file一下,查看文件信息

    32位文件

  3. checksec 查看文件的保护情况
    在这里插入图片描述
    开了canaru和栈不可执行

  4. 拖进ida里分析
    main函数:
    在这里插入图片描述
    先是要输入一个字符串,然后将字符串进行base64解密结果保存在v4里 ,v6保存v4的长度,对长度进行限制,不可以大于0xC。
    之后将v4的值拷贝到input参数里,input为.bss段的值。
    之后通过auth函数判断输入的内容的base64的值和题目给出的base64一不一样,若一样,则调用下面的correct函数,然后调用system函数。
    不可能碰撞出跟题目给出的哈希值一样的东西的,所以只能通过漏洞触发这个system函数。

correct函数:
在这里插入图片描述
call system的地址:
在这里插入图片描述

0x08049284,执行system(“bin/sh”)

auth函数:
在这里插入图片描述
有一个栈溢出漏洞,此时将输入的内容拷贝到v4z中,v4的位置 :ebp-8h,input的长度在上面已经进行了限制,不大于0xC。所以在这里可以有4个字节的溢出
栈上的情况:
在这里插入图片描述
根据上面 stack pivot的方法,可以将我们想要控制的栈的地址写到 EBP的位置。

因为我们输入的东西都被保存在了input上,并且是通过input进行栈溢出的,所以我们可以把这个地址设置成为input的地址,执行到新栈上的时候,就可以继续执行写入的内容。

示意图:
在这里插入图片描述
所以可以将“bbbb”搞成调用system的地址。

  1. 分析的差不多了,exp:
from  pwn import *
from base64 import* 

p = process("./login")

sys_addr = 0x8049284
bss_addr = 0x811eb40
payload = "aaaa" + p32(sys_addr) +p32(bss_addr)

print(payload)
payload = b64encode(payload)
print(payload)
#  gdb.attach(p)

p.sendline(payload)
p.interactive()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值