我使用函数fgetc
读取文件的每个字节,然后用printf
写入。
我刚注意到,当我将结果与十六进制编辑器进行比较时,fgetc
有时会错过一些字节。
例如,第一个错误始于第118个字节,还有许多其他错误随机发生......
有人见过这个吗?
这是代码(Windows)
char main(int argc, char* argv[]) {
FILE* fdIn;
FILE* fdOut;
long size = 0;
long i = 0;
char c = 0;
if (argc == 3) {
if ((fdIn = fopen(argv[1], "rt")) == NULL) {
printf("FAIL\n");
return 0;
}
if ((fdOut = fopen(argv[2], "w+")) == NULL) {
printf("FAIL\n");
return 0;
}
fseek(fdIn, 0L, SEEK_END);
size = ftell(fdIn);
fseek(fdIn, 0L, 0);
fprintf(fdOut, "unsigned char shellcode[%ld] = {", size);
while (i < size) {
c = fgetc(fdIn);
if (!(i % 16))
fprintf(fdOut, "\n\t");
fprintf(fdOut, "0x%02X", (unsigned char)c);
if (i != size - 1)
fprintf(fdOut, ", ");
i++;
}
fprintf(fdOut, "\n};\n");
fclose(fdIn);
fclose(fdOut);
printf("SUCCESS");
system("PAUSE");
}
return 0;
}
答案 0 :(得分:2)
以二进制模式打开文件。
// if ((fdIn = fopen((char*)argv[1], "rt")) == NULL) {
// >.<
if ((fdIn = fopen((char*)argv[1], "rb")) == NULL) {
在文本模式下,可能是基于Windows的计算机"rt"
,'\r'
,'\n'
对肯定会转换为'\n'
。 IAC,OP的十六进制转储目标不需要翻译。
第二期:fgetc()
返回int
或unsigned char
范围内的EOF
。使用类型int
将EOF
与所有数据输入区分开来。
// char c = 0;
int c = 0;
...
c = fgetc(fdIn);
// also add
if (c == EOF) break;