爱笑的姑娘 pwn学习,Arm

本文首发于“合天智汇”公众号作者:s0xzOrln
声明:笔者初衷用于分享与普及网络知识 , 若读者因此作出任何危害网络安全行为后果自负 , 与合天智汇及原作者无关!
刚刚开始学习ARMpwn , 下面如有错误 , 希望各位大佬多多包han , 多多包涵 。
先介绍下Arm的一些常见指令
那就先来
Arm三操作数指令
LDRBR0,[R1,#-1]#把R1-1的地址的值给R0立即数前面加个`#`看看函数开始时
PUSH{R4,R5,R7,LR}STMFDSP!,{R4-R11,LR}这两条指令都常见在函数的开始都是压入栈中Arm指令中的-感觉蛮简洁的 , 可以省略很多步骤和指令 。
{R0-R4}就是指R0R1R2R3R4寄存器ArmLDR指令
ldr指令的格式:LDRR0,[R1]LDRR0,=NAMELDRR0,=0X123对于第一种没有等号的情况 , R1寄存器对应地址的数据被取出放入R0对于第二种有等号的情况 , R0寄存器的值将为NAME标号对应的地址 。 对于第三种有等号的情况 , R0寄存器的值将为立即数的值LDM和STM是多数据传送指令 , 用来装载和存储多个字的数据从/到内存 。 比如:
STMFDSP!,{R4-R11,LR}的伪代码如下SP=SP-9×4;address=SP;fori=4to11Memory[address]=Ri;address=address+4;Memory[address]=LR;总的来说就是把{R4-R11}压到栈中 , 然后再把LR压到栈中指令格式是:xxM{条件}{类型}Rn{!},{^}‘xx’是LD表示装载 , 或ST表示存储 。 再加4种‘类型’就变成了8个指令:栈其他LDMEDLDMIB预先增加装载LDMFDLDMIA过后增加装载LDMEALDMDB预先减少装载LDMFALDMDA过后减少装载STMFASTMIB预先增加存储STMEASTMIA过后增加存储STMFDSTMDB预先减少存储STMEDSTMDA过后减少存储寄存器命名:
爱笑的姑娘 pwn学习,Arm


推荐阅读