我正在尝试编写一个脚本,它获取目标文件的十六进制字符,然后将输出(ascii格式)重定向到文件中的特定行。
基本上,我是这样的
export FILE=myobj_file
export j=''
for b in $(objdump -d -M intel $FILE | grep "^ " | cut -f2); do j+='\x'$b; done; echo $j
这将打印出十六进制代码(外壳代码):
\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
我想把它写入一个包含以下内容的文件中:
#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,如下所示:
sed '6s/%d/$j/' file.c
但我得到了一个错误。
我的结果应该是:
#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。
谢谢
发布于 2019-01-23 18:11:09
与hek2mgl的答案类似,我们使用一个带有占位符的模板文件(这里的副本相同):
/* ... */
int main() {
unsigned char code[] = "{{PLACEHOLDER}}"
printf("Length: %d\n", strlen(code));
int (*ret)() = (int(*)())code;
ret();
return 0;
}
/* ... */
因此,现在我们可以将{{PLACEHOLDER}}
替换为:
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
发布于 2019-01-23 18:14:09
我将在c文件中使用占位符:
/* ... */
int main() {
unsigned char code[] = "{{PLACEHOLDER}}"
printf("Length: %d\n", strlen(code));
int (*ret)() = (int(*)())code;
ret();
return 0;
}
/* ... */
然后使用两步方法(以/bin/ls为例):
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
发布于 2019-01-23 18:11:18
一般来说,我建议您更多地将此问题视为“模板”而不是“替代”。也就是说,将文件从file.c
重命名为file.c.template
。然后在您的模板中添加您想要修改的标记。例如:
#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 %>
,就完成了。
sed -e 's/<%\s*code_hex_string\s*%>/'"$j"'/' < file.c.template > file.c
一旦您有了这个概念,它也可以很好地转换为其他语言,并且您可以很容易地将bash脚本扩展到perl / python / groovy / C# /任何地方。
https://stackoverflow.com/questions/54332956
复制