gpt4 book ai didi

c - 将输入视为十六进制值

转载 作者:太空狗 更新时间:2023-10-29 15:29:19 24 4
gpt4 key购买 nike

我正在尝试学习如何创建 shellcode,我需要输入一大堆十六进制代码。但是,当我用十六进制代码给我的程序输入时,十六进制代码被视为普通的 ASCII 字符,反斜杠被简单地删除。

示例:

./a.out "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x35\x85\x04\x08"

在这种情况下,十六进制代码 (\x35\x85\x04\x08) 被视为单个字符 - 即 x=0x75 等。

我的程序处理输入的方式类似于以下:

int authentication(char *pass){
char password_buffer[16];
strcpy(password_buffer, pass);
return 1;
}

int main(int argc, char *argv[]){
if(authentication(argv[1])){
//access
}
return 1;
}

strcpy() 之后的内存转储:

0xbffff260: 0x41414141  0x41414141  0x41414141  0x41414141
0xbffff270: 0x78353378 0x30783538 0x38307834 0x08048400

如您所见,在地址 0xbffff270 处,内存值为 0x78353378,对应于 x35x,因此对应于十六进制代码输入中的前三个字母。我希望这四个字节是 0x08048535。

如何格式化我的输入来做到这一点?

最佳答案

你可以像这样使用 shell printf 函数:

./a.out "$(printf "AAAAA\x08\x32\x20\xfa\x10\x16")"

十六进制值将被转换为“二进制”。


这部分可能只会增加困惑,我可以而且可能会删除它:

否则,您还可以在程序内部进行快速转换,以使其更易于跨平台和系统使用。一个粗略的样本。 (这需要一个字符串并转换任何以 \xNN 形式呈现的十六进制序列,此外还会在完成时打印一个十六进制转储):

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

/*
* Hex Dump
* */
static void txt(unsigned char *buf, int len)
{
int i;
fprintf(stdout, " ");
for (i = 0; i < len; ++i) {
fprintf(stdout,
"%c",
isprint(buf[i]) ?
buf[i] :
'.'
);
}
}

static void xxd(unsigned char *buf, int len)
{
int i, j;

for (i = 0; i < len; ) {
if (!(i % 16)) {
fprintf(stdout,
"%s%03x: ",
i ? "\n" : "",
i
);
}
fprintf(stdout, "%02x ", buf[i]);
if (!(++i % 16))
txt(&buf[i - 16], 16);
}
if ((i % 16)) {
for (j = i; j % 16; ++j)
fprintf(stdout, " ");
txt(&buf[i - (i % 16)], i % 16);
}
fprintf(stdout, "\n");
}

/*
* Hex char to value.
* */
static unsigned hexval(char c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return ~0;
}
/*
* Convert all hex sequences.
* */
int str2bin(char *data, unsigned char **buf_ptr)
{
int len, converted = 0;
unsigned int val;
unsigned char *buf;

buf = malloc(strlen(data) + 1);
*buf_ptr = buf;

for (; *data; ) {
/* If next char is not backslash copy it and continue */
if (*data != '\\') {
*buf++ = *data++;
continue;
}
/* If we have anything else then x or X after, return error. */
if (data[1] != 'x' && data[1] != 'X')
return -1;
val = (hexval(data[2]) << 4) | hexval(data[3]);
/* If not valid hex, return error. */
if (val & ~0xff)
return -1;
*buf++ = val;
data += 4;
/* Keep track of converted numbers, "for fun". */
++converted;
}
len = buf - *buf_ptr;

fprintf(stderr, "%d hex values converted.\n", converted);

return len;
}

int main(int argc, char *argv[])
{
int len;
unsigned char *buf = NULL;
if (argc < 2) {
fprintf(stderr, "Missing argument.\n");
return 1;
}

if ((len = str2bin(argv[1], &buf)) < 0) {
fprintf(stderr, "Bad input.\n");
return 2;
}

xxd(buf, len);

free(buf);

return 0;
}

给你这样的东西:

$ ./hexin "Hello\x20\x44\x65\x08\x01\x00\x00\xf7\xdf\x00\x02Bye"
11 hex values converted.
000: 48 65 6c 6c 6f 20 44 65 08 01 00 00 f7 df 00 02 Hello De........
010: 42 79 65 Bye

关于c - 将输入视为十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21869321/

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