请问懂汇编的人:rsp寄存器有啥用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问懂汇编的人:rsp寄存器有啥用相关的知识,希望对你有一定的参考价值。

我在c++写的程序的反汇编中会看到函数会以 sub 0x8,rsp打头 会以add0x8,rsp retq
结尾。 rsp 在这里指向的是什么结构?

rsp寄存器就是指向栈区的寄存器,看main函数开始是,栈区已经有了返回地址,当main函数执行完毕后,通过函数尾部的ret指令就会到libc_start_main + 240处,这就是用于函数调用call ret,然后程序又会使用sub rsp,0x20来开扩局部变量的内存,也就是s,s总共0x20(32)个空间,

而且s地址在程序放回地址的上方,当正常输入大于40个数量时,此时程序的返回地址就会变成我们可控的数据,从而控制程序流程。

扩展资料

首先来控制没有任何保护的程序,因为没有任何保护。所以栈区可以执行,通过jmp rsp,或call rsp 就能执行shellcode,我们使用ROPgadget工具来找到这个指令(pwntools附带)ROPgadget --binary example --only 'jmp'|grep rsp。

但是无论是call rsp和jmp rsp都无法找到,这时可以通过libc库来寻找指令,libc库就和windows的dll类似,时所有动态链接linux程序都会加载的,但是基地址随机,所以要泄露libc地址,这个程序的返回地址就是在libc中。

所以可以用来泄露libc基地址,所有libc函数都在libc中(也就是scanf,read)等函数,大部分都在各种加载库中,而libc库就是一个必须的加载库。

只要输入40个字符,就能泄露这个地址,因为read函数不会产生\\x00截断,所以输入40个字符,此时40个字符后就是libc中的地址,没有\\x00截断符号,所以因为puts(s)就会将libc地址输出,此时libc中有jmp rsp指令。

参考技术A

rsp作用:在堆栈操作中使用,PUSH和POP指令是从SP寄存器得到现行堆栈段的段内偏移量,所以称SP寄存器为堆栈指针,SP始终指向栈顶。

堆栈是计算机中广泛应用的技术,基于堆栈具有的数据进出LIFO特性,常应用于保存中断断点、保存子程序调用返回点、保存CPU现场数据等,也用于程序间传递参数。

扩展资料

rsp是栈指针寄存器64位。指向栈顶,相当于32位汇编里的esp,16位的sp,用于指向栈的栈顶(下一个压入栈的活动记录的顶部),而EBP为帧指针,指向当前活动记录的底部。

栈指针与帧指针标识出了当前活动记录的位置,当函数被调用的时候,执行如下操作:

1将帧指针压入栈中:push ebp;用ebp保存当前栈指针:mov ebp,esp;使得栈指针自减,自减得到的内存应当能够被用来存储被调用函数的本地状态:sub esp,0CCh。

参考资料来源:百度百科――堆栈指针寄存器(rsp寄存器)

参考技术B rsp是栈指针寄存器,64位。指向栈顶。相当于32位汇编里的esp,16位的sp。追问

这个我知道。 请问如何从底层来理解这个步骤? 为什么不是用push 而是用sub呢? 编译 工具用的是gcc

追答

是为了不破坏数据地改变esp。push必须有一个操作数,所以执行会改变内存中的数值。

本回答被提问者采纳

请问列表和元组.怎么学.我看了半天没看懂怎么用,这个有啥用,求解谢谢

列表和元组是python中常用的两种数据类型。列表的类名是list,元组类名是tuple。
这两个都是用来‘装东西的’。例如你有一堆数,举个例子,你想求20个数的平均值,最大值,最小值,这个时候你需要一个容器把他们装起来。数组和元组就可以实现。例如:
list_a=[1,2,3,4,5,6,7,8,9,11,12,13,14,15,15,15,16,17,18,19]
tuple_a=(1,2,3,4,5,6,7,8,9,11,12,13,14,15,15,15,16,17,18,19)
这样就定义了一个容器把这些数字都寄存在里面。然后供后面的计算调用。
数组的标志是[],元组的标志是,。数组和元组最大的区别是一个是可变的一个是不可变的。
数组在定义之后可以改变任意一个数据,数组的长度也可以发生变化,可多可少。但是元组定义之后就是固定的。元素不能变,长度也不能变。
访问列表最简单的就是访问元素的下表。我想取列表中的第三个元素,用下表2(下标从零开始)
a_list=[1,2,3,4,5]
print(a_list[2])#打印出来3
同时可以改变特定位置的元素的值,例如
a_list[4]=15 #让数组第5个元素等于15
print(a_list[4])#打印出来15
元组访问元素也是一样的。但是因为元组不可变,所以元组的元素不能改变。
a_tuple=(1,2,3,4,5)
print(a_tuple[2])#打出3
数组还有一些常见的方法,例如,append,insert等。来自:求助得到的回答
参考技术A 全称量词与存在量词在查询时是怎么执行的,如何正确使用,书上有两个用全称量词的例了,执行方式完全两种理解才说的通

以上是关于请问懂汇编的人:rsp寄存器有啥用的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言中 寄存器有啥作用 怎么用

汇编中 [R1] 和R1有啥区别

将 xmm 寄存器推入堆栈时出错

了解反汇编程序:查看添加使用了多少字节

请问列表和元组.怎么学.我看了半天没看懂怎么用,这个有啥用,求解谢谢

初步的看一下C#窗体程序的直接反汇编代码