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
};
问题是我不知道如何正确使用此输出(编译,使用等)。如果有人可以帮忙,请做。谢谢!
#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!");
}
有关更多信息,请参见>
评论
它将仅将当前位置打印为c样式数组。如果要在代码中使用缓冲区,则可以使用它...@mrexodia,请考虑将您评论的内容重新编排为答案,以使其他人也有类似的问题。
@mrexodia是的,我知道,但是我不知道如何使用缓冲区...
我也不,为什么要C缓冲区?
@mrexodia我想知道如何使用它...