浅析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++语言printf命令使用方法

    C/C++语言printf命令使用方法 一、printf命令的作用 printf命令是C语言和C++语言中的一个常用的输出函数,用于将指定的文字、字符、数字等信息输出到屏幕上。其语法为: printf("格式化字符串", 输出参数); 其中,格式化字符串是一个包含格式控制字符和普通字符的字符串,控制字符串中使用%占位符表示需要输出的变量的…

    C 2023年5月23日
    00
  • NBA2KOL戴维斯投篮包怎么样 C级球员投篮包介绍

    NBA2KOL戴维斯投篮包怎么样 简介 NBA2KOL戴维斯投篮包是一种帮助球员提高投篮能力的道具,适用于NBA2KOL游戏中的C级球员。该投篮包的特点是能够提高球员相对上篮得分和中投得分的成功率,让球员在比赛中更容易得分。 获取方式 NBA2KOL戴维斯投篮包可以通过在游戏商店中购买获得。玩家需要使用游戏中的虚拟货币购买投篮包。 使用方法 使用NBA2KO…

    C 2023年5月23日
    00
  • 快云新架构震撼公测 1元体验300台高配置云服务器

    快云新架构震撼公测 1元体验300台高配置云服务器攻略 1. 登录快云官网 首先,在浏览器中输入https://www.kuaicloud.com/,进入快云的官方网站。 2. 注册账号并实名认证 如果您还没有在快云注册账号,请先注册一个账号并完成实名认证。实名认证可以提高您的账号安全等级,并对后续使用快云的操作起到保障作用。 3. 进入快云产品购买页面 在…

    C 2023年5月22日
    00
  • C语言如何用顺序栈实现回文序列判断

    C语言可以利用顺序栈来实现回文序列的判断,下面是实现的完整攻略。 什么是回文序列? 回文序列是一个正读与反读都相同的序列,例如:121, abccba。 用顺序栈实现回文序列判断 算法思路 回文序列的判断可以利用栈的先进后出的特性,我们可以将序列的前一半依次入栈,后一半依次和栈中元素进行出栈比较。如果每次比较都相等,则说明是回文序列。 代码实现 下面是C语言…

    C 2023年5月23日
    00
  • C语言如何实现可变参数详解

    下面我将详细讲解如何在C语言中实现可变参数。 可变参数的实现方式 在C语言中,可变参数的实现方式是使用stdarg.h头文件中的宏和函数。该头文件包含的是可变参数列表,一些宏和函数的定义,可以实现对参数的操作。 该头文件中常用的宏有: va_start:用于初始化可变参数列表,获取第一个可变参数值的地址。 va_arg:用于获取可变参数列表的下一个参数值。 …

    C 2023年5月23日
    00
  • 操作系统中的Hosts文件工作原理和作用及其详细介绍

    操作系统中的Hosts文件工作原理和作用及其详细介绍 Hosts文件介绍 在计算机网络中,Hosts文件是一个用于存储 IP 地址和主机名(域名)对应关系的纯文本文件,通常位于操作系统的系统目录下,在 Windows 系统中为 C:\Windows\System32\drivers\etc\hosts 文件。该文件是本地DNS的重要组成部分,可以将特定的主机…

    C 2023年5月23日
    00
  • Win10系统C盘怎么隐藏或显示? win10隐藏/恢复c盘的教程

    Win10系统C盘怎么隐藏或显示? 在Win10系统中,C盘是系统的核心盘符,存储着很多重要的系统文件和用户数据。但在一些特殊情况下,我们可能需要对C盘进行隐藏或显示操作来保护数据或进行某些调试,那么该怎么做呢? 隐藏C盘的教程 隐藏C盘是一个高风险的操作,建议在操作前备份好数据。 通过命令行操作 首先需要打开Win10系统的命令行界面: 点击开始按钮,在搜…

    C 2023年5月23日
    00
  • 如何通过C++求出链表中环的入口结点

    1. 环的入口结点(题目描述) 给定一个链表,返回链表中环的入口结点。如果链表无环,则返回 NULL。 要求算法的空间复杂度为 O(1)。 2. 思路分析 这道题可以使用双指针法(快慢指针)来解决。 具体的思路为:首先,设定两个指针,分别为 fast 和 slow,然后,让它们以不同的速度往前走(fast 比 slow 快),这样,当两个指针重合时,就表示链…

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