博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20145203盖泽双 反汇编代码实践
阅读量:5283 次
发布时间:2019-06-14

本文共 1578 字,大约阅读时间需要 5 分钟。

反汇编代码实践

(1)使用vim 20145203gdbtest.c编写代码。代码如下图

890515-20161203235600412-1312348275.png

(2)产生汇编代码:

gcc -S 20145203gdbtest.c -o 20145203gdbtest.scat 20145203gdbtest.s

890515-20161203235815146-1406526523.png

890515-20161203235938162-32835186.png

890515-20161204000024240-1405245514.png

(3)产生反汇编代码:

gcc -c 20145203gdbtest.s -o 20145203gdbtest.oobjdump -d 20145203gdbtest.o

890515-20161204000239865-1122854221.png

(4)利用gdb进行调试


补充一下有关gdb调试的相关命令

1、查看函数调用栈信息的GDB命令

① backtrace/bt n

n是一个正整数,表示只打印栈顶上n层的栈信息。

-n表一个负整数,表示只打印栈底下n层的栈信息。

② frame n

n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。

这个指令的意思是移动到n指定的栈帧中去,并打印选中的栈的信息。如果没有n,则打印当前帧的信息。

③ up n

表示向栈的上面移动n层,可以不打n,表示向上移动一层。

④ down n

表示向栈的下面移动n层,可以不打n,表示向下移动一层。

2、gdb基础调试命令

890515-20161204001512084-631645811.png


开始gdb调试

gcc -g 20145203gdbtest.c -o 20145203gdbtestgdb 20145203gdbtest

①查看源代码

890515-20161204002114490-811948182.png

②在main处设置断点

890515-20161204002045615-282655177.png

③运行一下

890515-20161204002022209-616674711.png

④使用disassemble指令获取汇编代码

890515-20161204002002834-1339113896.png

⑤用i(info) r(registers)指令查看各寄存器的值:

890515-20161204001942990-414889220.png

反汇编代码分析:

汇编流程分析:这个程序的流程其实是sec函数调用了add的过程

①首先sec先把它的%ebp寄存器压入栈作为帧指针,然后压入被保存的寄存器、本地变量和临时变量,最上面是参数构造区域。然后再用call调用add,这时又把返回地址压入栈。

②add被调用后,把它的帧指针%ebp压入栈,然后压入寄存器、本地变量、临时变量,最上面是参数构造区域。

③add运算结束前,add会把%ebp弹出栈,然后ret指令弹出并跳转到之前call压入的地址,返回到sec过程,最后因为leave,%ebp出栈。

汇编代码分析,下面逐行解释:

①删除gcc产生代码中以"."开头的编译器指得到如下代码:

add:    pushl   %ebp    ;将%ebp入栈,为帧指针,将父函数的栈底寄存器存入当前程序栈中    movl    %esp, %ebp      movl    8(%ebp), %eax   :从父函数堆栈中取得参数,存入ax寄存器    addl    $9, %eax    :完成+9操作    popl    %ebp    ;%ebp出栈,恢复父函数堆栈    retsec:    pushl   %ebp    ;将%ebp入栈,为帧指针    movl    %esp, %ebp    subl    $4, %esp    movl    8(%ebp), %eax    movl    %eax, (%esp)    call    add     ;调用add函数    leave           ;为返回准备栈,相当于%ebp出栈main:    push    &ebp    mov %esp,%ebp    push    $0xf    call    21 
add $0x4,%esp add $0x8,%eax :完成+8操作 leave ret

②针对每条指令画出相应栈帧的情况:

890515-20161205215826038-1647868176.jpg

转载于:https://www.cnblogs.com/GZSdeboke/p/6135691.html

你可能感兴趣的文章
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
css & input type & search icon
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
MetaWeblog API Test
查看>>
c# 文件笔记
查看>>
类和结构
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>