gpt4 book ai didi

c++ - 将操作码打印为asm格式

转载 作者:行者123 更新时间:2023-12-02 10:33:52 25 4
gpt4 key购买 nike

我的Shellcode在我的程序中被更改,

然后,我希望能够将其打印出来,以检查是否一切正确。

我将如何打印它,使其以设置 vector 的方式可读。

std::vector<unsigned char> shellcode  = {
0xB8, 0x00 ,0x00, 0x00, 0x00, //mov eax, 0
0xFF, 0x30, //push [eax]
0xFF, 0x70, 0x04, //push [eax+4]
0xFF, 0x70, 0x08, //push [eax+8]
};

printf("Opcode generated:");
for (int i = 0; i < shellcode.size(); i++) {
printf(" 0x%02x", (unsigned char)(shellcode[i] & 0xFF));
}

应该是一个更短的方法
printf("Opcode generated:\n");
for (int i = 0; i <= 4; i++) {
printf(" 0x%02X", shellcode[i]);
}
printf("\n");
for (int i = 5; i <= 6; i++) {
printf(" 0x%02X", shellcode[i]);
}
printf("\n");
for (int i = 7; i <= 9; i++) {
printf(" 0x%02X", shellcode[i]);
}
printf("\n");
for (int i = 10; i <= 12; i++) {
printf(" 0x%02X", shellcode[i]);
}
printf("\n");

最佳答案

一种解决方案是创建一个std::vector<std::vector<unsigned char>>并使用range-for循环来打印值。

这是一个工作示例(live):

#include <cstdio>
#include <vector>

int main()
{
std::vector<std::vector<unsigned char>> shellcode = {
{ 0xB8, 0x00 ,0x00, 0x00, 0x00 }, //mov eax, 0
{ 0xFF, 0x30 }, //push [eax]
{ 0xFF, 0x70, 0x04 }, //push [eax+4]
{ 0xFF, 0x70, 0x08 }, //push [eax+8]
};

printf("Opcode generated:\n");
for ( const auto& row : shellcode )
{
for ( const auto& byte : row )
{
printf(" 0x%02X", byte);
}
printf("\n");
}

return 0;
}

输出:
Opcode generated:
0xB8 0x00 0x00 0x00 0x00
0xFF 0x30
0xFF 0x70 0x04
0xFF 0x70 0x08

另一种解决方案是保持这样的线长( live):
#include <cstdio>
#include <vector>

int main()
{
const std::vector<unsigned char> shellcode
{
0xB8, 0x00 ,0x00, 0x00, 0x00, //mov eax, 0
0xFF, 0x30, //push [eax]
0xFF, 0x70, 0x04, //push [eax+4]
0xFF, 0x70, 0x08, //push [eax+8]
};

const auto lineLengths = { 5, 2, 3, 3 };

printf("Opcode generated:\n");
auto index {0u};
for ( auto lineLength : lineLengths )
{
while ( lineLength-- )
{
printf(" 0x%02X", shellcode[index++]);
}
printf("\n");
}

return 0;
}

您可以在进入打印循环之前添加一个断言,即 shellcode的大小必须等于 lineLengths的总和。像这样:
#include <numeric>
#include <cassert>
assert( std::accumulate(lineLengths.begin(), lineLengths.end(), 0) == shellcode.size() );

这是带有断言的实时示例: https://godbolt.org/z/n5B-42

关于c++ - 将操作码打印为asm格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61172154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com