首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过管道将十六进制转换为sed,并将其输出附加到文件中

通过管道将十六进制转换为sed,并将其输出附加到文件中
EN

Stack Overflow用户
提问于 2019-01-24 01:50:23
回答 4查看 116关注 0票数 0

我正在尝试编写一个脚本,它获取目标文件的十六进制字符,然后将输出(ascii格式)重定向到文件中的特定行。

基本上,我是这样的

代码语言:javascript
代码运行次数:0
运行
复制
export FILE=myobj_file
export j=''
for b in $(objdump -d -M intel $FILE | grep "^ " | cut -f2); do j+='\x'$b; done; echo $j

这将打印出十六进制代码(外壳代码):

代码语言:javascript
代码运行次数:0
运行
复制
\xeb\x0d\x5e\x31\xc9\x67\x2a\x42\x4b\x55\x55\x55\x85\xc8\xc3\xc4\x85\xd9\xc2\xeb\xe8\xe8\xe8\xe8\xe9\xe9\xe9\xe9

我想把它写入一个包含以下内容的文件中:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

int main() { 
unsigned char code[] = {{PLACEHOLDER}} /*Here need to be inserted*/
printf("Length:  %d\n", strlen(code));

    int (*ret)() = (int(*)())code;
    ret();
    return 0;


}

我尝试通过管道将输出传递给sed,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
sed '6s/%d/$j/' file.c

但我得到了一个错误。

我的结果应该是:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

int main() { 
unsigned char code[] = \
"\xeb\x0d\x5e\x31\xc9\x67\x2a\x42\x4b\x55\x55\x55\x85\xc8\xc3\xc4\x85\xd9\xc2\xeb\xe8\xe8\xe8\xe8\xe9\xe9\xe9\xe9";
printf("Length:  %d\n", strlen(code));

    int (*ret)() = (int(*)())code;
    ret();
    return 0;


}

或者我得到一个关于sed的错误,或者我通过将\x41转换为'A‘而不是插入\x41来插入十六进制代码而不是ASCII。

谢谢

EN

回答 4

Stack Overflow用户

发布于 2019-01-24 02:11:09

hek2mgl的答案类似,我们使用一个带有占位符的模板文件(这里的副本相同):

代码语言:javascript
代码运行次数:0
运行
复制
/* ... */

int main() { 
    unsigned char code[] = "{{PLACEHOLDER}}"
    printf("Length:  %d\n", strlen(code));
    int (*ret)() = (int(*)())code;
    ret();
    return 0;
}

/* ... */

因此,现在我们可以将{{PLACEHOLDER}}替换为:

代码语言:javascript
代码运行次数:0
运行
复制
 awk 'BEGIN{FS="\t"}
      (NR==FNR) && /^ /{
         sub(" +$","",$2);gsub(" ","\\x",$2); string=string "\\x" $2
         next;
      }
      (NR == FNR) { next }
      /{{PLACEHOLDER}}/{ sub("{{PLACEHOLDER}}",string ) }
      1' <(objdump -d -M intel $FILE) code.c > updated_output.c
票数 2
EN

Stack Overflow用户

发布于 2019-01-24 02:14:09

我将在c文件中使用占位符:

代码语言:javascript
代码运行次数:0
运行
复制
/* ... */

int main() { 
    unsigned char code[] = "{{PLACEHOLDER}}"
    printf("Length:  %d\n", strlen(code));
    int (*ret)() = (int(*)())code;
    ret();
    return 0;
}

/* ... */

然后使用两步方法(以/bin/ls为例):

代码语言:javascript
代码运行次数:0
运行
复制
string="$(objdump -d -M intel /bin/ls | awk -F'\t' '/^ /{gsub(/^|\y \y/, "\\\\x", $2);gsub(/ /,"",$2);printf "%s", $2}')"
sed "s/{{PLACEHOLDER}}/${string}/" file.c
票数 1
EN

Stack Overflow用户

发布于 2019-01-24 02:11:18

一般来说,我建议您更多地将此问题视为“模板”而不是“替代”。也就是说,将文件从file.c重命名为file.c.template。然后在您的模板中添加您想要修改的标记。例如:

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
#include <string.h>

int main() { 
unsigned char code[] = \
<% code_hex_string %>
printf("Length:  %d\n", strlen(code));

    int (*ret)() = (int(*)())code;
    ret();
    return 0;


}

现在,您的sed所要做的就是用实际的十六进制字符串替换<% code_hex_string %>,就完成了。

代码语言:javascript
代码运行次数:0
运行
复制
sed -e 's/<%\s*code_hex_string\s*%>/'"$j"'/' < file.c.template > file.c

一旦您有了这个概念,它也可以很好地转换为其他语言,并且您可以很容易地将bash脚本扩展到perl / python / groovy / C# /任何地方。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54332956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档