大家好,欢迎来到IT知识分享网。
本次的分享,我们将以一段简单的C语言程序为例,使用mips-linux的gcc编译器对其进行编译后,使用ida对编译后的程序进行反汇编,并通过对照C语言代码的方式理解MIPS汇编指令。
首先我们来看这段C代码(test.c):
#include <stdio.h> #include <string.h> void B() {
printf(".....\n"); } void A(char *content) {
char buf[32]; strcpy(buf, content); printf("buf: %s\n", buf); B(); } void main(int argc, char **argv) {
A(argv[1]); }
在代码中,main函数直接调用A函数,并将第一个命令行参数作为函数A的参数传递过去,在函数A中,使用strcpy函数将参数保存到局部变量buf中,然后是使用printf函数打印buf变量。最后函数A调用了函数B,在函数B中只是简单的调用了printf函数打印了一串字符串常量。
我们使用mips-linux-gnu-gcc命令将源码编译,得到名为test的可执行文件:
$ mips-linux-gnu-gcc -static test.c -o test
编译后,使用qemu-mips命令执行这个test程序:
$ cp /usr/bin/qemu-mips-static . $ ./qemu-mips-static ./test AAAAAAAA buf: AAAAAAAA .....
可以看到,我们编译的程序是可以正常运行的。
我们通过今天分享,通过将我们自己编写的C代码编译为mips-linux架构的程序,并使用IDA对其进行逆向分析,初探了MIPS汇编代码。对于繁杂的汇编代码,看似要记住的指令有很多,但它们不过是一些英文单词的缩写组合而成的。比如add代表加法、i代表Immediat,就是立即数、u代表unsigned,就是无符号、lw中的l代表load,就是加载的意思,w代表word,就是4个字节的意思、jal指令中的j代表jump,就是跳转的意思、a代表address,就是跳转到某个地址的意思、l代表long,就是跳转的地址距离jal这条指令很远的意思(这个l代表long纯属乱猜,只是为了方便自己记忆)。
希望本节的分析能够为你打开进入MIPS汇编世界的大门。下次分享中,我们会继续通过分析main函数调用的A函数的反汇编代码,以此来增强我们对汇编语言的理解。
最后希望本次的分享能够为你带来帮助,谢谢大家。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136568.html