20155231 cho3 课下作业

20155231 cho3 课下作业

4

1 通过输入gcc -S -o main.s main.c 将下面c程序”week0603学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}

  1. 删除汇编代码中 . 开关的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码

删除后的代码:


g:

    
    pushq   %rbp
    
    movq    %rsp, %rbp
    
    movl    %edi, -4(%rbp)
    movl    -4(%rbp), %eax
    addl    $3, %eax
    popq    %rbp
    
    ret
    

f:


    pushq   %rbp

    movq    %rsp, %rbp

    subq    $24, %rsp
    movl    %edi, -20(%rbp)
    movl    $13, -4(%rbp)
    movl    -20(%rbp), %eax
    movl    %eax, %edi
    call    g
    movl    %eax, %edx
    movl    -4(%rbp), %eax
    addl    %edx, %eax
    leave

    ret


main:

    pushq   %rbp

    movq    %rsp, %rbp


    movl    $8, %edi
    call    f
    addl    $1, %eax
    leave

    ret

1072993-20171030100235590-1786798656.png

5

1 通过输入gcc -S -o main.s main.c 将下面c程序”week0603学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}

  1. 参考,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。
    1072993-20171030100247855-233439.png

缓冲区溢出漏洞实验

  • 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
    遇到的问题:
  • 在虚拟机上准备环境时总是失败,就用了实验楼环境做。
    1072993-20171030100307136-1558289099.png

  • 根据实验步骤安装环境,写入代码。
  • 首次实验失败,重新gdb计算shellcode地址。
    1072993-20171030100341230-2094961710.png
    1072993-20171030100401246-210589990.png

  • 我的shellcode的地址为: 0xffffd2a0(十六进制)+100(十进制)=0xffffd2e0(十六进制)
    1072993-20171030100411824-1901590294.png

  • 在exploit.c文件中更改地址。
  • 实验成功。
    1072993-20171030100425355-1615101600.png

还学到了:GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。
而 -z execstack 用于允许执行栈。

转载于:https://www.cnblogs.com/javasyn/p/7749751.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值