__libc_csu_init函数的通用gadget
.text: ; =============== S U B R O U T I N E =======================================
.text:
.text:
.text: public __libc_csu_init
.text: __libc_csu_init proc near ; DATA XREF: _start+16o
.text: push r15
.text: mov r15d, edi
.text: push r14
.text: mov r14, rsi
.text:000000000040084A push r13
.text:000000000040084C mov r13, rdx
.text:000000000040084F push r12
.text: lea r12, __frame_dummy_init_array_entry
.text: push rbp
.text: lea rbp, __do_global_dtors_aux_fini_array_entry
.text: push rbx
.text: sub rbp, r12
.text: xor ebx, ebx
.text: sar rbp,
.text:000000000040086A sub rsp,
.text:000000000040086E call _init_proc
.text: test rbp, rbp
.text: jz short loc_400896
.text: nop dword ptr [rax+rax+00000000h]
.text:
.text: loc_400880: ; CODE XREF: __libc_csu_init+54j
27 .text:0000000000400880 mov rdx, r13
28 .text:0000000000400883 mov rsi, r14
29 .text:0000000000400886 mov edi, r15d
30 .text:0000000000400889 call qword ptr [r12+rbx*8]
31 .text:000000000040088D add rbx, 1
32 .text:0000000000400891 cmp rbx, rbp
33 .text:0000000000400894 jnz short loc_400880
.text:
.text: loc_400896: ; CODE XREF: __libc_csu_init+36j
.text: add rsp,
37 .text:000000000040089A pop rbx
38 .text:000000000040089B pop rbp
39 .text:000000000040089C pop r12
40 .text:000000000040089E pop r13
41 .text:00000000004008A0 pop r14
42 .text:00000000004008A2 pop r15
.text:00000000004008A4 retn
.text:00000000004008A4 __libc_csu_init endp
.text:00000000004008A4
.text:00000000004008A4 ; ---------------------------------------------------------------------------
x64中的前六个参数依次保存在RDI, RSI, RDX, RCX, R8和 R9中
r13 =rdx=arg3
r14 =rsi=arg2
r15d=edi=arg1
r12= call address
这段gadgets用于在X64下进行rop,根本原因是X64使用寄存器传参无法直接用栈进行rop。具体用法如下:
分为两部分使用
1.执行gad1
.text:000000000040089A pop rbx 必须为0
.text:000000000040089B pop rbp 必须为1
.text:000000000040089C pop r12 call!!!!
.text:000000000040089E pop r13 arg3
.text:00000000004008A0 pop r14 arg2
.text:00000000004008A2 pop r15 arg1
.text:00000000004008A4 retn ——> to gad2
2.再执行gad2
.text:0000000000400880 mov rdx, r13
.text:0000000000400883 mov rsi, r14
.text:0000000000400886 mov edi, r15d
.text:0000000000400889 call qword ptr [r12+rbx*8] call!!!
.text:000000000040088D add rbx, 1
.text:0000000000400891 cmp rbx, rbp
.text:0000000000400894 jnz short loc_400880
.text:0000000000400896 add rsp, 8
.text:000000000040089A pop rbx
.text:000000000040089B pop rbp
.text:000000000040089C pop r12
.text:000000000040089E pop r13
.text:00000000004008A0 pop r14
.text:00000000004008A2 pop r15
.text:00000000004008A4 retn ——> 构造一些垫板(7*8=56byte)就返回了
此外还有一个老司机才知道的x64 gadgets,就是 pop rdi,ret的gadgets。这个gadgets还是在这里,但是是由opcode错位产生的。
如上的例子中4008A2、4008A4两句的字节码如下
0x41 0x5f 0xc3
意思是pop r15,ret,但是恰好pop rdi,ret的opcode如下
0x5f 0xc3
因此如果我们指向0x4008A3就可以获得pop rdi,ret的opcode,从而对于单参数函数可以直接获得执行
与此类似的,还有0x4008A1处的 pop rsi,pop r15,ret
那么这个有什么用呢?我们知道x64传参顺序是rdi,rsi,rdx,rcx。
所以rsi是第二个参数,我们可以在rop中配合pop rdi,ret来使用pop rsi,pop r15,ret,这样就可以轻松的调用2个参数的函数。
综上,我们介绍了x64下利用通用gadgets调用一个参数、两个参数、三个参数函数的方法。
__libc_csu_init函数的通用gadget的更多相关文章
- JavaScript中绑定事件监听函数的通用方法addEvent() 和 事件绑定之bindEvent()与 unBindEvent()函数
下面绑定事件的代码,进行了兼容性处理,能够被所有浏览器支持: function addEvent(obj,type,handle){ try{ // Chrome.FireFox.Opera.Safa ...
- RCTF2015 pwn试题分析
pwn200 漏洞给的很明显,先是读到了main的局部数组中,然后在子函数中向子函数的局部数组栈里复制. 总体思路是leak system的地址,然后再向一个固定地址写入/bin/sh,最后执行sys ...
- 一个简洁通用的调用DLL函数的帮助类
本次介绍一种调用dll函数的通用简洁的方法,消除了原来调用方式的重复与繁琐,使得我们调用dll函数的方式更加方便简洁.用过dll的人会发现c++中调用dll中的函数有点繁琐,调用过程是这样的:在加载d ...
- (原创)一个简洁通用的调用DLL函数的帮助类
本次介绍一种调用dll函数的通用简洁的方法,消除了原来调用方式的重复与繁琐,使得我们调用dll函数的方式更加方便简洁.用过dll的人会发现c++中调用dll中的函数有点繁琐,调用过程是这样的:在加载d ...
- 理解 JavaScript 回调函数并使用
JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...
- javascript 函数初探 (四)--- 回调函数
回调函数 既然函数与任何被赋值给变量的数据是相同的,那么她当然可以像其他数据那样被定义.删除.拷贝,以及当成参数传递给其它函数. 我们定义一个函数,这个函数有两个函数类型的参数,然后他会分别执行这两个 ...
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...
- 理解和使用 JavaScript 中的回调函数
理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报 分类: JavaScript(4) 目录( ...
- strtoull函数的使用,及相关信息汇总
kafka中涉及到序列化,有一个参数是在发送消息实体前边以一个序列号打头, seq = strtoull((prdcfgval+1), NULL, 10); do_seq = 1; 其中(prdcfg ...
随机推荐
- 在Django中使用ORM创建图书管理系统
一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ...
- 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)
[BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...
- min_25筛
min_25筛 用来干啥? 考虑一个积性函数\(F(x)\),用来快速计算前缀和\[\sum_{i=1}^nF(i)\] 当然,这个积性函数要满足\(F(x),x\in Prime\)可以用多项式表示 ...
- vue之——从彩笔的进步之路
因为这个文章开的有点晚,不可能说从头教学vue的使用,所以大概还是记录一下我的学习路线吧: 一开始是想学一个前端框架,最后选择了vue,一开始是看了表严肃的vue课程,b站有,讲的相当好,就算打个小广 ...
- BZOJ3784树上的路径
题目描述 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a<b.将这n*(n-1)/2个距离从大到小排序, ...
- Pandas系列(七)-计算工具介绍
内容目录 1. 统计函数 2. 窗口函数 3. 加深加强 数据准备 # 导入相关库 import numpy as np import pandas as pd #Pandas 中包含了非常丰富的计算 ...
- 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题
#方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...
- 第十节:利用async和await简化异步编程模式的几种写法
一. async和await简介 PS:简介 1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程跟简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算. 2. ...
- Newton's Dark Secrets《牛顿探索》
1643年1月4日,在英格兰林肯郡小镇沃尔索浦的一个自耕农家庭里,牛顿诞生了.牛顿是一个早产儿,出生时只有三磅重,接生婆和他的亲人都担心他能否活下来.谁也没有料到这个看起来微不足道的小东西会成为了一位 ...
- python 排序之sort
#coding:utf-8 #求列表的第二大值 list_test =[6,2,4,6,1,2,3,4,5] list_test.sort() print list_test[-2] "&q ...