十四、MIPS汇编指令-子函数

我们回顾一下上次分享中的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]);
}

这次我们主要关注A函数,从MIPS汇编语言的角度解析字符串数组在栈上如何分配的,以及如何调用子函数的。

首先,我们看一下IDA对函数A的反汇编结果:
在这里插入图片描述

在A函数的第一行汇编指令中,我们可以看到,它又是使用addiu $sp, -0x50指令为A函数分配了0x50个字节的函数栈空间(栈顶指针sp向下移动了0x50个字节),并使用var_40、var_34、var_2C、var_C、var_8、var_4这几个作为变量名,这些变量就分别指向了A函数的0x50字节的栈空间中的不同位置,关于这几个变量在函数A栈帧中的位置分布情况,如图:
在这里插入图片描述

由这幅图,我们可以轻易的理解,如果var_2C变量的内容存在溢出的情况,就可能将var_4变量的内容覆盖,这其实就是栈空间缓冲区溢出原理的最简单的体现方式。

由函数A的汇编指令的第二行,我们不难看到,sw r a , 0 x 50 + v a r 4 ( ra, 0x50+var_4( ra,0x50+var4(sp)指令的意思是,将ra寄存器的值保存到var_4变量中,在函数A的汇编指令的倒数第5行使用lw r a , 0 x 50 + v a r 4 ( ra, 0x50+var_4( ra,0x50+var4(sp)指令,将var_4变量中的值恢复到ra寄存器中,然后在函数的末尾使用jr $ra指令将程序的执行流程跳转回main函数继续执行,这样就保证了在A函数内部,无论有多少函数试图改变ra寄存器的值,都不会破环程序的正常执行逻辑,即执行完A函数,会回到main函数继续向下执行:
在这里插入图片描述

从汇编代码的第6行,我们可以知道,var_40变量用于保存全局变量,gp是global pointer的意思,即全局指针,就代表了函数中的全局变量所在的区域。

汇编代码的第7行,将函数A的第一个参数即a0,存储到var_34变量中,也就是程序执行过程中传入的“AAAAAAAA”字符串。

第11行,将var_2C变量赋值给v0,后又在第13行将v0赋值给了a0。

第14行,将“AAAAAAAA”字符串赋值给了a1。

至此,若要调用strcpy函数,它的两个参数已经准备好了,由此,我们可以推测,a0代表的var_2C就是A函数内部的buf变量:

        char buf[32];

a1就代表“AAAAAAAA”字符串。

接着,汇编代码的第16行使用bal指令,调用了strcpy行数。

后面类似的原理,又分别使用bal和jal指令调用了printf函数和B函数。

至此,我们从一个简单的C代码开始,先分析了main函数的反汇编代码,又分析了main函数调用的子函数代码,并通过绘制处main函数及其调用的子函数的栈帧图示来理解函数调用栈是如何变化的。通过这些简单的函数调用流程,在结合一些英文单词的缩写,我们很容易识别处各条汇编指令的含义。

如果你对MIPS汇编指令还有些搞不懂,也没关系,在后面的分享中,我会通过几个经典的shellcode代码案例,使你在学习shellcode的同时,再进一步夯实MIPS汇编指令的基础能力。

最后希望这次的分享能够为你带来帮助,谢谢大家。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后知晚觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值