我编写了一个简单的hello world程序,并将其放在radare2中。然后,我运行pc命令,该命令显示C输出。输出如下:

#define _BUFFER_SIZE 256
const uint8_t buffer[256] = {
  0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x10, 0x48, 0x8d,
  0x3d, 0x3b, 0x00, 0x00, 0x00, 0xc7, 0x45, 0xfc, 0x00, 0x00,
  0x00, 0x00, 0xb0, 0x00, 0xe8, 0x0d, 0x00, 0x00, 0x00, 0x31,
  0xc9, 0x89, 0x45, 0xf8, 0x89, 0xc8, 0x48, 0x83, 0xc4, 0x10,
  0x5d, 0xc3, 0xff, 0x25, 0x80, 0x00, 0x00, 0x00, 0x4c, 0x8d,
  0x1d, 0x71, 0x00, 0x00, 0x00, 0x41, 0x53, 0xff, 0x25, 0x61,
  0x00, 0x00, 0x00, 0x90, 0x68, 0x00, 0x00, 0x00, 0x00, 0xe9,
  0xe6, 0xff, 0xff, 0xff, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20,
  0x77, 0x6f, 0x72, 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x01, 0x00,
  0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00,
  0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00,
  0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x8b, 0x0f,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
  0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x10, 0x00,
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x00, 0x00,
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


问题是我不知道如何正确使用此输出(编译,使用等)。如果有人可以帮忙,请做。谢谢!

评论

它将仅将当前位置打印为c样式数组。如果要在代码中使用缓冲区,则可以使用它...

@mrexodia,请考虑将您评论的内容重新编排为答案,以使其他人也有类似的问题。

@mrexodia是的,我知道,但是我不知道如何使用缓冲区...

我也不,为什么要C缓冲区?

@mrexodia我想知道如何使用它...

#1 楼

pc命令将从当前搜索(s)输出n个字节作为C数组,其中n是块大小(b)或命令中提到的长度。

然后可以使用输出,例如,在radare2之外操作数组,构建shellcode,解密缓冲区等。

通过以下示例进行演示一个简单的例子。
这是一个小的HelloWorld.c程序:

#include  <stdio.h>

void main()
{
        printf("Hello, World!\n");
}


让我们用gcc HelloWorld.c -o HelloWorld对其进行编译,并使用radare2将其打开r2 -A HelloWorld

现在让我们寻求main并打印功能:

[0x00400400]> s main
[0x004004d7]> pdf
            ;-- main:
/ (fcn) sym.main 17
|  sym.main ();
|           ; DATA XREF from 0x0040041d (entry0)
|       0x004004d7      55             push rbp
|       0x004004d8      4889e5         mov rbp, rsp
|       0x004004db      bf74054000     mov edi, str.Hello__World_ ; "Hello, World!"
|       0x004004e0      e80bffffff     call sym.imp.puts          ; int puts(const char *s)
|       0x004004e5      90             nop
|       0x004004e6      5d             pop rbp
\       0x004004e7      c3             ret


我刚才说过,只是一个简单的Hello World程序:)

现在而不是打印反汇编,让我们使用pxf只打印函数的十六进制字节:

0x004004d7  5548 89e5 bf74 0540 00e8 0bff ffff 905d  UH...t.@.......]
0x004004e7  c3


这些是代表函数的十六进制字节。
最后,使用bf sym.main将当前的块大小定义为main的大小,然后使用pc打印C数组:

[0x004004d7]> bf sym.main
[0x004004d7]> pc
#define _BUFFER_SIZE 17
const uint8_t buffer[17] = {
  0x55, 0x48, 0x89, 0xe5, 0xbf, 0x74, 0x05, 0x40, 0x00, 0xe8,
  0x0b, 0xff, 0xff, 0xff, 0x90, 0x5d, 0xc3
};


您可以轻松地看到数组是由我们之前打印的十六进制字节(从0x55(q43 12079q)到0xc3(push rbp)。就是这样。例如,假设您反汇编了一个程序并发现了XOR加密的数据,然后想将其转储到C程序中并在其中进行操作。在这种情况下,您需要寻找加密数据的偏移量(return),将块大小定义为数据的长度(s <addr>),然后使用b 150将其作为C数组转储(或使用pc作为python数组转储) pcp)。


反编译
有人希望pc命令将程序反编译为C。如果要在雷达中将函数反编译为C,则可以使用以下命令之一可以通过以下方式:

pdc命令打印类似C的语法:

function sym.main () {
    loc_0x4004d7:

     //DATA XREF from 0x0040041d (entry0)
       push rbp                 
       rbp = rsp                
       edi = str.Hello__World ; "Hello, World!"                                                                       
       int puts(const char * s : 0x00400574 = Hello, World!)                                    
       pop rbp                  

}


使用r2dec-一个可以产生伪C输出的雷达插件
使用radeco-一个基于radeco-lib的雷达反编译工具。
使用r2snowman-集成了雪人反编译器的radare2插件。

#2 楼

我想扩展一下MegaBeets很棒的答案。我看不出pdc的意义。似乎错了很多,层次也越来越少了。如果我想要高级的东西,我将在r2dec中使用pdf。您可以使用pdd安装它。

[0x0000063a]> pdd
/* r2dec pseudo C output */
#include <stdint.h>

void main (void) {
    puts ("Hello, World!");
}


有关更多信息,请参见>