【CTF】逆向基础2

  • ret2libc的基本原理

ret2libc是绕过DEP的一个思路,顾名思义是利用系统中已经存在的系统函数来构造对DEP的攻击,思路大概有三种,通过ZwSetInformationProcess函数将DEP关闭、通过VirtualProtect函数将shellcode所在内存设为可执行、通过VirtualAlloc函数开辟具有执行权限的空间。

  • format string利用的基本原理

format string利用基本上是为了达到一个内存任意写的目的,利用printf函数不定参数个数的参数寻址方式的漏洞,以及转换指示符%n。

  • ROP的基本原理

举一个简单例子,说明ROP构造Gadget过程,栈空间形式化表示如下:

Gadget构造过程描述:

假设攻击者打算将V1值写入V2所指向的内存空间,即Memory[V2] = V1;攻击者控制了栈空间,能够构造栈空间布局;攻击者采用间接方式,寻找等效指令实现,通过寻找Gadget指令实现;

Gadget执行过程描述:

1) 初始时,栈顶指针为ESP,所指向内容为V1,EIP=a1。2) POP操作,ESP值加4,POP相当于内存传送指令。3) POP和MOV指令执行完,CPU会继续向下顺序执行。4) RET相当于POP+JMP,所以RET操作,ESP值也会加4。

ROP利用Gadget图形示意(摘自国外一份ppt):

时间: 04-05

【CTF】逆向基础2的相关文章

【CTF】逆向基础知识1

虽然逆向涉及的知识比较多,但是如果把应用限定在CTF题目之类的话,我们这里对经常用到的一些基础知识做一个总结. 思路来源:Blue-lotus&信协集训&c++安全编码&0day安全&Google stack frame 的基本概念 ebp 的作用是? ebp和esp是栈的顶端.底端的标志 ebp 和 esp 是怎么相互配合的? 相互配合是指在函数调用时,ebp入栈,被赋新值,然后esp抬高,从而在函数调用时开辟新的栈帧并保持栈帧平衡. calling convention

android逆向基础:apk 反编译 重打包 重签名

apk 反编译大家都比较熟悉,这里只做一个笔记. 1 反编译 apk apktool d perfect.apk 这样就把资源文件解压缩了, classes.dex 也反编译成了 smali 文件 2 修改 smali 文件 得到 smali 文件,现在就可以对 smali 文件进行修改和添加自己的代码了. 当然可以进一步用  dex2jar 处理将  dex 转成 java class 文件, 再用  jd-jui 等反编译成 java 代码. 现在 apk 基本都做了混淆, 但仔细读还是基本

Java逆向基础之动态生成类

为什么有这个东西,一方面时AOP框架的需要,另一方面是增加软件逆向的难度 动态生成类的技术目前大体上分为两类,一类是通过操作字节码框架如cglib/Javassist去实现,另一类就是JNI方式,调用dll/so库,内存中动态还原.这两种方式都能实现隐藏类 看一个Javassist动态生成类的例子 package com.vvvtimes; import java.lang.reflect.Modifier; import javassist.ClassPool; import javassis

Java逆向基础之初识javaagent

首先说一下javaagent是什么 javaagent是一种能够在不影响正常编译的情况下,修改字节码. 在逆向中javaagent可以完成对类的拦截和增强. 看一个例子 在Eclipse新建如下MyAgent结构的项目 MyAgent.java文件内容 package com.vvvtimes.demo.agent; import java.lang.instrument.Instrumentation; public class MyAgent {     public static void

Java逆向基础之导出内存中的类一

为什么需要这个,因为在之前的博文中提到,为了增加逆向的难度,部分软件会对部分关键方法和类进行隐藏,所以我们需要把这个类从内存中拿出来. 本文介绍使用javaagent的方法,下一篇介绍dumpclass,两种方法各有利弊. 本文需要用到第三方jar为:javassist-3.20.0-GA.jar,不过我们需要的是它的源码javassist-3.20.0-GA-sources.jar 新建名为DumpClassAgent的项目,项目结构如下 将下载到的源码复制到src目录下 DumpClassA

Java逆向基础之JDB动态调试

本文参考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jdb.html JDB在有源代码的时候可以实现调试远程机器上的java程序,但是在逆向中源码很难分析出来,不过还是能够调试得到一部分信息的 本文主要获取两个信息 1.动态调用混淆类中的方法,因为实践过程中我们去手动补全相关代码比较难 2.打印调用栈 以下例子以调试ZKM.jar为例 JDB无源代码调试调用方法 启动Xdebug调试 java -Xdebug -X

Java逆向基础之AspectJ的Around方法修改方法体

在逆向中,我们往往通过修改某个方法达到目的,在javaassist中有insertBefore,insertAfter,setBody,在AspectJ中也可以通过Around实现类似的功能. 看一个简单的例子 java文件Main.java //Main.java package com.vvvtimes; public class Main { public int add(int x, int y) { return x + y; } public int add(int x, int y

Android逆向基础----Dalvik字节码

参考此微博,更多详细内容可以到这里查看 http://blog.csdn.net/dd864140130/article/details/52076515 Dalvik字节码 1.寄存器位32位,64位数据(double)用两个相邻的32寄存器表示. 2.两种类型:基本类型和引用类型(对象和数组) 全限定名是什么? 以String为例,其完整名称是Java.lang.String,那么其全限定名就是java/lang/String;,即java.lang.String的"."用&quo

Android逆向基础----APK文件结构

参考这个博客 http://www.cnblogs.com/wangtianxj/archive/2010/06/13/1757639.html APK文件结构: AndroidManifest.xml                 配置清单 META-INF                                  签名 assets                                        资源 classes.dex