浅析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++智能指针之shared_ptr详解

    C++智能指针之shared_ptr详解 什么是智能指针 智能指针是一种特殊类型的指针,它会自动管理指针所指向的内存,从而避免了因为内存管理不当而导致的内存泄露、多次释放等问题。C++11中提供了三种智能指针:unique_ptr、shared_ptr和weak_ptr。 shared_ptr的介绍 shared_ptr是一种智能指针,它可用于多个指针共享同…

    C 2023年5月23日
    00
  • win7系统打开程序提示应用程序正常初始化0xc0000142失败的原因及解决方法

    win7系统打开程序提示应用程序正常初始化0xc0000142失败的原因及解决方法 问题描述 在使用Windows 7系统时,打开应用程序时会出现提示“应用程序无法启动,应用程序无法正常初始化(0xc0000142)。单击确认关闭应用程序。”的错误提示。 原因分析 0xc0000142错误通常指的是程序无法正常初始化,可能由于以下原因导致: 应用程序的关键文…

    C 2023年5月23日
    00
  • C++面向对象编程之析构详解

    C++面向对象编程之析构详解 概述 在C++面向对象编程中,析构函数是一种特殊的成员函数,它在对象被销毁时调用。析构函数通常用于在对象被销毁前,释放对象所占用的资源,如动态分配的内存空间、文件句柄等。 析构函数的函数名与类名相同,但前面加上 “~” 符号,且析构函数没有返回值和参数。 class MyClass { public: MyClass(); ~M…

    C 2023年5月22日
    00
  • Go语言的JSON处理详解

    Go语言的JSON处理详解 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。JSON是JavaScript原生支持的数据格式,因此可以被广泛应用于AJAX技术,通过HTTP请求发送JSON数据,实现网页与服务器之间的数据交互。 Go语言中的JSON Go…

    C 2023年5月23日
    00
  • 雅虎公司C#笔试题(后半部份才是)

    “雅虎公司C#笔试题(后半部份才是)”是一道常见于程序员面试和笔试的题目。下面就从如何解题的角度,为大家讲解完整攻略。 题目描述 题目大意是给出两个字符串,求它们在其中一个字符串中的最长公共子串。 具体需要完成的是,实现一个方法 string Find(string str1, string str2, string source),其中: 参数 str1 …

    C 2023年5月23日
    00
  • C语言中如何进行运算?

    在C语言中,运算是指将一个或多个操作数结合在一起并应用特定的运算符以生成一个结果。C语言中支持多种运算类型,如算术运算、赋值运算、比较运算、逻辑运算等。 算术运算 C语言中的算术运算包括加、减、乘、除、取模等操作。其中,加、减、乘、除分别对应运算符 +、-、*、/,取模使用运算符%。下面是算术运算的示例代码: #include<stdio.h> …

    C 2023年4月27日
    00
  • 详解编译器编译原理

    下面是详解编译器编译原理的完整攻略。 什么是编译器? 编译器是一种将源代码转换为目标代码的程序。源代码可以是任何一种高级语言,例如C、C++、Java等等,而目标代码则是汇编语言或机器语言。编译器有很多种,常见的有GCC、Clang等。 编译器的基本流程 编译器的基本流程分为三个阶段:词法分析、语法分析和代码生成。 1. 词法分析 词法分析阶段将源代码分解成…

    C 2023年5月23日
    00
  • iOS中的多线程如何按设定顺序去执行任务详解

    下面是详细的“iOS中的多线程如何按设定顺序去执行任务详解”的攻略: 1. 前言 在iOS开发中,使用多线程进行异步操作可以提高用户体验,但由于多线程的特性,线程执行的顺序不一定按照我们期望的顺序去执行,这就会导致一些问题。本文将详细讲解如何按照设定顺序去执行任务,希望对大家有所帮助。 2. 多线程 在iOS中常用的多线程技术有四种: NSThread GC…

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