2017-2018-1 20155201 《信息安全系统设计基础》第五周学习总结

2017-2018-1 20155201 《信息安全系统设计基础》第五周学习总结

教材学习内容总结

一、Linux内核分析实验一
  1. 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
int g(int x){
    return x+3;
}
int f(int x){
    return g(x);
}
int main(void){
    return f(8)+1;
}

通过输入gcc -S -o main.s main.c -m32将c程序编译成32位汇编代码
cat main.s查看汇编码
1065407-20171022225714021-7922184.jpg

查询资料知道:

eax:函数返回值保存寄存器
ebp:栈底指针寄存器
esp:栈顶指针寄存器(运行中的每个程序都有一段堆栈空间,用来存放程序运行中的数据)
eip:当前指令位置寄存器
······
  1. 教材导读:程序的机器级表示
    1. gcc -S xxx.c -o xxx.s获得汇编代码;想要64位机器上获得32位汇编代码gcc -m32 -S xxx.c
    2. objdump -d xxx.o反汇编1065407-20171022225908537-1643822400.jpg

    3. 不同数据的汇编代码后缀:1065407-20171022225729177-1713620981.png

    4. 寄存器的理解:1065407-20171022225743412-1883792058.png

    5. 寻址方式:操作数(operand)指示出执行一个操作中要使用的源数据值,以及放置结果的目的位置。第一种立即数,用来表示常数值;第二种寄存器表示某个寄存器的内容。第三种内存引用,根据计算出来的地址(有效地址)访问某个内存位置。有效地址的计算方式:Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s1065407-20171022230023474-1834611062.png

    6. 数据传送指令1065407-20171022225802052-27622432.png

    7. 算术与逻辑操作1065407-20171022225815631-1992938792.png

    8. 汇编语言中的条件控制

    ## x in %rdi ,y in %rsi
    
    absdiff_se:
    cmpq   %rsi, %rdi               ##比较x,y
    jge    .L2      ## if x>=y 跳转L2
    addq   $1, lt_cnt(%rip)    ##lt_cnt++
    movq   %rsi, %rax     %rsi送入%rax
    subq   %rdi, %rax           ##%rax-%rdi送入%rdi
    ret       ##return
    .L2:
    addq   $1, ge_cnt(%rip)   ##ge_cnt++
    movq   %rdi, %rax        ##向x传值
    subq   %rsi, %rax        ##%rax-%rsi的值送入%rax
    ret    ##return
    1. while循环
    ## n in %rdi
    fact_do:
    movl   $1, %eax    ##set %eax=1
    .L2:
    imulq   %rdi, %rax    ##%rax * %rdi送入%rax
    subq    $1, %rdi     ##%rdi自减
    cmpq    $1, %rdi     ##比较n:1
    jg   .L2       ## if n>1, 跳转.L2
    rep; ret      ##return 

教材学习中的问题和解决过程

  • 问题1:如何理解运行时的栈?
  • 问题1解决方案:当过程P调用过程Q时,会把返回的地址压入P的栈帧中,指明当Q返回时,P从哪里开始执行。
    Q的代码会扩展当前栈的边界,分配他的栈帧所需要的空间,在这个空间,它可以保存寄存器的值,分配局部变量的空间,为调用过程设置参数。当Q运行时,P以及所有在向上追溯到P的调用链中的过程都是被挂起的,同时此时Q的栈帧在栈顶。

1065407-20171022225833177-1272039420.png

1065407-20171022225856177-400542660.png

代码调试中的问题和解决过程

  • 问题1:如何理解实验楼课程linux内核汇编码main.s
  • 问题1解决方法:
##%esp栈顶指针 %ebp栈底指针
_g:                                  
    pushl   %ebp    ##将%ebp压栈
    movl    %esp, %ebp    ##将%esp保存到%ebp 函数标准开头
    pushl   %eax    ##将%eax压栈
    movl    8(%ebp), %eax    ##%eax=8
    movl    %eax, -4(%ebp)    ##%ebp-4=%eax=8
    movl    -4(%ebp), %eax
    addl    $3, %eax   ##%eax+3=8+3
    addl    $4, %esp    ##%esp+4
    popl    %ebp
    retl


_f:                                  
    pushl   %ebp
    movl    %esp, %ebp
    subl    $8, %esp              
    movl    8(%ebp), %eax
    movl    %eax, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    calll   _g
    addl    $8, %esp
    popl    %ebp
    retl


_main:                               
    pushl   %ebp    ##将%ebp压栈
    movl    %esp, %ebp    ##将%esp保存到%ebp 函数标准开头
    subl    $24, %esp    ##增加栈空间%esp-24
    movl    $8, %eax    ##%eax=8
    movl    $0, -4(%ebp)    ##%ebp-4=0
    movl    $8, (%esp)    ##%esp=8
    movl    %eax, -8(%ebp)         ##%ebp-8=x     
    calll   _f
    addl    $1, %eax    ##%eax++
    addl    $24, %esp    ##%esp+24
    popl    %ebp    ##%ebp弹栈
    retl

代码托管

1065407-20171022225847162-913372053.jpg

结对及互评

本周结对学习情况

  • 20155313

  • 结对学习内容
    汇编代码、函数调用的栈情况

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周195/1951/110/10
第三周314/7061/215/25
第五周254/9601/310/35
  • 计划学习时间:12小时

  • 实际学习时间:10小时

参考资料

转载于:https://www.cnblogs.com/zhuohua/p/7712507.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值