首先了解下Linux中的保护机制(具体的绕过等后续再说)

1.canary(栈保护)

在函数开始时就随机产生一个值,将这个值CANARY放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖ebp或者ebp下方的返回地址时,一定会覆盖掉CANARY的值;当程序结束时,程序会检查CANARY这个值和之前的是否一致,如果不一致,则不会往下运行,从而避免了缓冲区溢出攻击。

2.NX(no execute)

数据不可执行。原理是将数据所在内存页标识为不可执行,防止因为程序运行出现溢出而使得攻击者的shellcode可能会在数据区尝试执行的情况。NX是对栈和堆的一种保护机制。实验需要关闭NX和地址随机化,否则执行shellcode时,CPU就会抛出异常,而不是去执行恶意指令。

Linux系统叫做NX,Windows系统中类似的机制叫DEP(Data Execute Prevention)。

3.PIE(position-independent executables)

地址随机化。

4.ASLR

代码部分地址无关

Ret2text

首先file和checksec一下:

ida打开:

观察到有个vulnerable()函数:

还有个后门函数:get_shell()

gdb打开,main处下断点后跟进,输入12345678后查看stack:

此时ebp= 0xffffd108,

将黄色与红色全部覆盖后填入get_shell()的地址。

exp如下:

getshell:

ret2shellcode

首先file和checksec一下:

发现rwx并且没有开NX保护,所以代码在堆,栈上可以执行

进入IDA查看,发现这题并没有后门函数,将gets到的s拷贝到buf2.

查看buf2所在的bss段是否可执行

main处下断点后run起来,此时ebp=0xffffd118!

exp如下:

shellcraft.sh()是一段shellcode,ljust()是左对齐,不足处用a填充,画图来说就是这样:

ret2syscall

首先file和checksec一下:

这题是静态链接的,所以比较大,

ida查看,有/bin/sh,但是没有system函数,

Linux的系统调用通过int 80h和寄存器来实现,其中eax存放系统调用号,过程如下:

1.先将系统调用号放入eax
2.将该函数需要的其他参数存入其他寄存器
3.出发0x80中断(int 0x80h)

所以我们需要一些pop和ret指令,这些小片段叫gadget,可以使用ROPgadget这个工具,

本次要用到的:execve("/bin/sh",0,0)

eax = 0xb  --->系统调用号
ebx = address of "/bin/sh"
ecx = 0
edx = 0

可以看到有许多gadget,选一些有用的就OK。

gdb调试,ebp:0xffffd128

exp如下:

画图来说就是:(下图并不是上面exp的图)

PWN_ret2text,ret2syscall,ret2shellcode的更多相关文章

  1. Ret2shellcode

    利用原理 ret2shellcode,即控制程序执行 shellcode 代码.一般来说,shellcode 需要我们自己填充.这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码 ...

  2. stackoverflow的ret2syscall利用

    ret2syscall 系统调用 ret2syscall,即控制程序执行系统调用,获取shell.Linux将内核功能接口制作为系统调用(system call),可在程序中直接调用.程序中存在int ...

  3. 再识ret2syscall

    当初学rop学到的ret2syscall,对int 0x80中断了解还不是很深,这次又复习了一遍.虽然很简单,但是还是学到了新东西.那么我们就从ret2syscall开始吧. IDA一打开的时候,就看 ...

  4. PWN菜鸡入门之栈溢出(1)

    栈溢出 一.基本概念: 函数调用栈情况见链接 基本准备: bss段可执行检测: ​ gef➤ b main Breakpoint at . gef➤ r Starting program: /mnt/ ...

  5. pwnable.kr-echo1-Writeup

    pwnable.kr - echo1 - writeup 原文链接:https://www.cnblogs.com/WangAoBo/p/pwnable_kr_echo1.html 旧题新做,发现这道 ...

  6. pwn之ret2libc

    0×01 利用思路 ret2libc 这种攻击方式主要是针对 动态链接(Dynamic linking) 编译的程序,因为正常情况下是无法在程序中找到像 system() .execve() 这种系统 ...

  7. 渗透入门rop

    原文链接:https://blog.csdn.net/guiguzi1110/article/details/77663430?locationNum=1&fps=1 基本ROP 随着NX保护 ...

  8. 【pwn】学pwn日记——栈学习(持续更新)

    [pwn]学pwn日记--栈学习(持续更新) 前言 从8.2开始系统性学习pwn,在此之前,学习了部分汇编指令以及32位c语言程序的堆栈图及函数调用. 学习视频链接:XMCVE 2020 CTF Pw ...

  9. Pwn学习随笔

    Pwn题做题流程 使用checksec检查ELF文件保护开启的状态 IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试) 编写python的exp脚本进行攻击 (若攻击不成功)进行GDB动态调试 ...

随机推荐

  1. angular8 大地老师学习笔记---第十课

    import { Component,Input} from '@angular/core';@Component({ selector: 'app-lifecycle', templateUrl: ...

  2. 第三章 Nacos Discovery--服务治理

    之前我讲过 Nacos文章 的内容,想要深入了解的 朋友的话,可以去看看 ,我们继续承接上篇讲下去 --> 第二章 : 微服务环境搭建 3.1 服务治理介绍 先来思考一个问题 通过上一章的操作, ...

  3. Linux系统搭建RabbitMQ

    下载erlang和rabbitmq-server 1.下载Erlang安装包 [root@VM_0_9_centos soft]# wget http://erlang.org/download/ot ...

  4. vue API 知识点(4) --- 指令、特殊 attribute 、内置组件

    一.指令 1.v-text <span v-text="msg"></span> <!-- 两种写法是一样的 --> <span>{ ...

  5. OC 大数组分割成由小数组重新组合的新数组

    NSLog(@"++++%@",[self seprateBigArrBySize:3 BigArr:@[@"1",@"2",@" ...

  6. 百度Echarts中国地图经纬度

    百度显示中国地图的地址 https://www.makeapie.com/explore.html#sort=rank~timeframe=all~author=all%3Ftdsourcetag v ...

  7. 自动化运维工具-Ansible之6-Jinja2模板

    自动化运维工具-Ansible之6-Jinja2模板 目录 自动化运维工具-Ansible之6-Jinja2模板 Ansible Jinja2模板概述 Ansible Jinja2模板使用 Ansib ...

  8. TurtleBot3使用课程-第二节a(北京智能佳)

    目录 1.[第3类]LRF(LDS)传感器 2 1.1 传感器包安装 2 1.1.1 传感器端口访问设置 2 1.1.2 运行hlds_laser_publisher节点 2 1.1.3 在RViz中 ...

  9. kubectl常用命令(个人记录)

    一.获取pod信息 1.获取当前集群运行的所有的pods的信息 kubectl get pod   2.获取当前集群运行的所有的pod运行在哪个节点 kubectl get pods -owide   ...

  10. spark:join与cogroup

    1.RDD[K,V],键值对类型的rdd的函数在PairRDDFunctions这个类中 rdd类中,通过隐士转换让rdd有了PairRDDFunctions这个类里面方法的功能 2.rdd 的joi ...