浅析shellcode 反汇编模拟运行及调试方法

让我来介绍一下关于“浅析shellcode 反汇编模拟运行及调试方法”的完整攻略。

1. 背景介绍

首先,让我们来了解一下什么是shellcode。shellcode指的是一个用于利用计算机系统的漏洞或开发后门的一段二进制代码。一般情况下,这个shellcode由黑客手动编写,并通过某个手段传送到受害机器上去执行。为了成功执行shellcode,黑客们通常会进行一系列针对代码和系统的分析。而本文要讨论的就是如何通过反汇编模拟运行和调试来实现对shellcode的分析。

2. 反汇编模拟运行

反汇编是一种将机器码转换成汇编语言的过程。在对shellcode进行分析时,我们需要将其反汇编为汇编语言。常见的反汇编工具包括GDB和IDA。

2.1 GDB反汇编

GDB是一款非常常用的GNU调试器。可以用GDB来反汇编已有的二进制文件,或者通过GDB也可以反汇编已有的内存。

在通过GDB对shellcode进行反汇编时,我们可以使用以下命令:

gdb
file shellcode
disassemble

其中,file命令用来打开目标文件,disassemble命令用来将给定函数反汇编后输出其汇编指令。一般情况下,通过GDB进行反汇编的操作比较基础,主要是用来初步了解shellcode的功能和代码结构。

2.2 IDA反汇编

IDA是一款非常强大的反汇编工具,可以将二进制文件反汇编为高级语言伪代码,方便分析者理解和阅读。一般情况下,通过IDA对shellcode进行反汇编的操作比较复杂,需要分析者拥有一定的汇编和逆向工程知识。

在通过IDA对shellcode进行反汇编时,我们需要使用以下步骤:

  • 打开IDA,选择File > Open,将目标文件打开。
  • 选择Options > General > Processor Type,选择正确的处理器类型。
  • 选择View > Open Subviews > Strings,以便能够在伪代码中看到字符串。
  • 在IDA中分析代码,查看反汇编结果。

需要注意的是,IDA的使用需要一些逆向工程知识。针对于shellcode的分析,我们需要学习一些汇编语法和函数调用方面的知识,以便能够准确地理解反汇编结果。

3. 调试的方法

通过反汇编,我们能够对shellcode的结构和功能有一定的了解。但在实际分析过程中,我们还需要对shellcode进行调试,以便了解其执行过程中每个指令的具体执行情况。

3.1 使用GDB调试

在通过GDB对shellcode进行调试时,我们可以在其中设置断点,单步执行,查看寄存器的值等等。常见的调试命令如下:

  • break main - 在主函数处设置断点。
  • run - 运行程序。
  • step - 单步调试,即一条一条地执行。
  • next - 单步调试,但是不过深入函数内部。
  • continue - 继续运行程序,直到下一个断点或者程序结束。
  • info registers - 查看CPU寄存器的值。
  • x/10x $esp - 查看栈中10个字节的值。

3.2 使用gdb-peda调试

gdb-peda是一个针对GDB的Python脚本,提供了很多方便的调试命令,可以帮助分析者更方便地分析和调试shellcode。

在通过gdb-peda对shellcode进行调试时,我们可以使用以下命令:

  • peda shellcode - 将shellcode汇编成二进制数据,在内存中查看。
  • peda asm - 将汇编代码汇编成二进制数据,在内存中查看。
  • peda display /i $eip - 每次操作时都显示eip寄存器值。
  • peda pattern create 1024 - 生成1024字节的模式字符串,用于寻找shellcode中的字符溢出等问题。
  • peda pattern search - 在寻找溢出等问题时,可以使用这个命令。
  • peda searchmem /x 90 90 90 - 查找内存中是否存在NOP指令。
  • peda runarg - 将shellcode以参数的形式传递给程序并运行。
  • peda vmmap - 查看进程的内存状态。

4.示例

下面提供两个使用GDB对shellcode进行调试的示例:

4.1 示例1

通过GDB调试以下这段shellcode:

"\x31\xc0\x50\x68\x62\x61\x73\x68\x68\x62\x69\x6e\x2f\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"

该shellcode是一个C程序调用的execve("/bin/bash"),用于创建一个能够以root权限执行的bash shell。我们可以通过以下步骤来调试该shellcode:

  1. 使用vim或者其他文本编辑器将上述shellcode写入名为"shellcode"的文件中。

  2. 使用gcc编译该文件为可执行文件:

gcc -z execstack -o shell shellcode

-z execstack参数需要被加入,以允许栈处能够执行代码。

  1. 执行程序:

./shell

程序会提示Permission denied.

  1. 使用GDB运行程序:

gdb shell

  1. 设置断点:

breakpoint main

  1. Run程序:

run

程序执行到breakpoint,同时我们也可以看到程序在输出"Permission denied"之前停留。

```
[----------------------------------registers-----------------------------------]
EAX: 0x0
EBX: 0xbffff0d8 --> 0xb7ff1000 --> 0x464c457f
ECX: 0x1
EDX: 0xbffff114 --> 0xbffff125 ("./shell")
ESI: 0x0
EDI: 0x0
EBP: 0x0
ESP: 0xbffff0d8 --> 0xb7ff1000 --> 0x464c457f
EIP: 0x80483b1 (: pop %edi)
EFLAGS: 0x282 (CARRY parity adjust zero SIGN trap INTERRUPT direction overflow)
[------------------------------------------------------------------------------]

gdb-peda$ x/10i $eip
=> 0x80483b1 : pop edi
0x80483b2 : xor eax,eax
0x80483b4 : push eax
0x80483b5 : push 0x68736162
0x80483ba : push 0x6e69622f
0x80483bf : mov ebx,esp
0x80483c1 : push eax
0x80483c2 : mov edx,esp
0x80483c4 : push edx
0x80483c5 : push ebx
0x80483c6 : mov ecx,esp
0x80483c8 : mov al,0xb
gdb-peda$

```

通过以上操作,我们可以在主函数的pop指令处设置断点,并可以查看其前后的汇编代码。

  1. 继续执行程序:

continue

程序输出"Sorry I have to leave you"等内容,退出程序。

4.2 示例2

通过下列尝试使用gdb-peda调试一个shellcode:

"\x31\xc0\x89\xc3\x6a\xb0\x66\xb3\x01\x68\x04\xd2\xc7\x4d\x66\x68\x01\x01\x89\xe1\x6a\x10\x51\x53\x89\xe1\xcd\x80\x89\xc2\x31\xc0\x6a\x66\x58\x52\x42\x89\xd3\x6a\x02\x89\xe1\xcd\x80\x31\xc0\x50\x50\x89\xe1\x89\xc6\x68\x3f\x8f\x04\x08\x51\x56\x89\xe1\xcd\x80\x31\xc0\x50\x56\x89\xe1\xb3\x04\xb0\x04\xcd\x80"

这个shellcode是在启动时执行一些Perl代码,然后调用execve()执行一个shell。

以下是我们可以使用gdb-peda进行调试的步骤:

  1. 和第一个示例类似,我们需要使用vim或其他文本编辑器将上述代码写入文件中,并通过gcc进行编译,使用如下命令:

gcc -z execstack -mpreferred-stack-boundary=2 -o shell shellcode

该命令将结果存入名为"shell"的可执行文件中。

  1. 使用gdb-peda打开程序:

gdb -q shell

使用"-q"参数表示进入"quiet"模式。

  1. 反汇编代码,并将shellcode输出到内存中:

disassemble main

peda shellcode

  1. 运行程序并查看结果:

run

  1. 查看程序mmap和内存状态:

peda vmmap

peda searchmem 0x08048f3f

  1. 设置断点并进行调试:

break *main+38

continue

可以使用多个gdb-peda命令调试程序:

peda x $eip
peda x/10i $eip
peda si
peda nexti

最后,我们可以使用"q"命令来退出调试器:

q

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析shellcode 反汇编模拟运行及调试方法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言位图及位图的实现

    C语言位图是一种数据结构,它可以表示二进制位的布尔值,常用于压缩数据等领域中。在C语言中,我们可以通过使用位运算符、结构体等方式来实现位图。下面将介绍如何实现位图的过程及注意事项。 位图的数据结构 位图的数据结构通常分为两部分,一是记录总共分配的位数,二是记录实际使用的位数。我们可以定义一个结构体来表示位图的数据,如下所示: typedef struct {…

    C 2023年5月23日
    00
  • C语言编程时常犯十八个错误小结

    以下是详细讲解“C语言编程时常犯十八个错误小结”的完整攻略: 一、背景介绍 C语言是一门广泛使用的编程语言,但它也有很多容易犯的错误。这些错误不仅会导致程序的崩溃,还会影响到程序的运行效率。为了帮助C语言入门者避免这些错误,本文会对常见的18个错误进行分析和总结,供大家参考。 二、常见错误及解决方法 1. 数组越界 如果使用一个不存在的数组下标来访问数组中的…

    C 2023年5月23日
    00
  • 基于C语言实现的贪吃蛇游戏完整实例代码

    “基于C语言实现的贪吃蛇游戏完整实例代码”攻略 1. 总体介绍 该贪吃蛇游戏代码是基于C语言实现的经典小游戏。具体实现方式是控制某一个方向键使蛇移动,每次蛇吃到食物的时候,则身体变长,直到蛇的身体覆盖整个游戏屏幕。此过程中有各种UI,比如分数、游戏结束等。此代码使用的是Windows平台的控制台界面。 2. 代码实现步骤 2.1 游戏的设置 将控制台窗口的大…

    C 2023年5月30日
    00
  • C 程序 两个浮点数相乘

    首先,对于“C程序两个浮点数相乘”的完整使用攻略,我们需要了解一些基础知识。 在C语言中,我们可以使用float和double两种数据类型来表示浮点数。其中,float占用4个字节(32位),double占用8个字节(64位),所以在大多数情况下我们都会使用double类型来代表浮点数。 在C语言中,我们可以使用*运算符来实现两个浮点数相乘。具体使用方法请看…

    C 2023年5月9日
    00
  • C语言之没有main函数的helloworld示例

    下面是详细讲解“C语言之没有main函数的helloworld示例”的完整攻略。 1. 简介 在C语言中,如果我们要编写一个程序,必须有一个名为main的函数作为程序的入口点。然而,在某些特定的情况下,我们可能需要编写一个没有main函数的程序。 2. 原理 C语言中,程序的入口点是main函数。当我们执行一个程序时,操作系统会首先调用main函数。如果我们…

    C 2023年5月23日
    00
  • C++ 如何使用栈求解中缀、后缀表达式的值

    C++ 中,我们可以使用栈来求解中缀表达式的值或者先将中缀表达式转换为后缀表达式再进行求解。下面我将演示如何使用栈求解中缀表达式的值和后缀表达式的值。 求解中缀表达式的值 步骤 创建两个栈,一个用于存储操作数,另一个用于存储运算符。 从左到右遍历中缀表达式。 如果当前字符是数字,则入操作数栈。 如果当前字符是运算符,则与运算符栈中的栈顶运算符比较,如果当前运…

    C 2023年5月23日
    00
  • C++如何实现简易扫雷游戏

    以下是“C++如何实现简易扫雷游戏”的完整攻略: 1. 游戏规则 扫雷游戏的规则如下:给定一个网格,每个格子可能是地雷或者数字,玩家需要翻转每个格子,如果它是地雷,则游戏结束,如果是数字,则表示周围八个格中地雷的数量,玩家需要根据数字推测哪些格子是地雷,最后揭示出所有非地雷格子以完成游戏。 2. 实现步骤 在 C++ 中,我们可以采用面向对象的思想,定义格子…

    C 2023年5月23日
    00
  • 适合新手小白DEV C++的使用方法

    下面将为您详细讲解“适合新手小白DEV C++的使用方法”的完整攻略。 简介 DEV C++是一款免费、开源的C/C++ IDE,适用于初学者和中级开发人员开发C/C++应用程序。它具有易于使用、功能强大、跨平台等特点。本篇攻略将详细讲解如何使用DEV C++进行C/C++程序的编写、调试、编译和运行。 下载与安装 首先,你需要在官网上下载和安装DEV C+…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部