说明
原始文章系列
https://azeria-labs.com/writing-arm-assembly-part-1/
翻译-进作者的专栏可以翻到所有翻译
系列:https://zhuanlan.zhihu.com/p/109057983
系列:https://www.anquanke.com/post/id/86383
0x00 调试环境
使用arm架构的系统,只为了学习汇编,把其他复杂降低
下载 https://drive.google.com/drive/folders/107uMlL_DS8yD2TS_0yrHXBDnLOj44a8P 链接中的armv6_stretch.zip文件
修改start.sh文件为
#!/bin/bashqemu-system-arm \-cpu arm1176 \-m 256 \-net user,hostfwd=tcp::2222-:22 -net nic \-kernel kernel-qemu-4.4.34-jessie \-M versatilepb \-no-reboot \-serial stdio \-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw console=ttyAMA0" \-nographic -monitor /dev/null \-hda ./raspbian-stretch.img \
修改ssh.sh文件内容为
#!/bin/bashSSH_PORT=2222echo "[+] user 'pi' / password 'raspberry'"
ssh -4 -p ${SSH_PORT} pi@localhost"$@"
先运行start.sh
,再运行ssh.sh
,输入密码raspberry
就能进入
拷贝宿主机中的start.bat
文件到虚拟机中pi
用户的家目录
中(需要输入pi
的密码raspberry
)
- 在宿主机中执行
scp -P 2222 start.bat pi@127.0.0.1:~
把虚拟机中的pi
用户家目录
中的test.bat
文件拷贝到宿主机中(需要输入pi
的密码raspberry
)
- 在宿主机中执行
scp -P 2222 pi@127.0.0.1:~/test.bat .
安装gdb、gcc,并安装gdb调试插件peda
0x01 忘掉啥从左到右,从右到左,就是整体平移
0x02 LDM/STM-IA/IB/DA/DB
-IA(之后增加)、-IB(之前增加)、-DA(之后减少)、-DB(之前减少)
- i 是往地址增大的方向,整体平移放置
- d 是往地址减小的方向,整体平移放置
- A 就是正常的逻辑
- B 跳过op1直接指向的内容,从下一个或上一个开始
0x03 LDM/STM-FA|FD|EA|ED
- 栈地址的增长方向:
- A:ARM将向高地址增长的栈称为递增栈( Acendant Stack)
- D:将向低地址增长的栈称为递减栈(Descendent Stack)
- 栈指针的指向位置:
- F:ARM将栈指针指向栈顶元素位置的栈称为满栈(Full Stack)
- E:将栈指针指向即将入栈的元素位置的栈称为空栈(Empty Stack)
D和A的含义:都是相对于入栈的增长方向
来说的
F和E的含义:入栈和出栈时sp指向的地址的作用来说的
- 对于入栈
- Full:sp所指向的地址有内容了,不可以放东西
- Empty: sp指向的是空的,可以放东西
- 对于出栈
- Full:sp指向的内容有内容,可以把里面的内容用于出栈
- Empty: sp指向的是空的,不能用于出栈