我试图反转一个字符串,但它只是保持不变。除了<string.h>and之外,我不使用任何模块<stdio.h>。
void rev(s){
char i, temp;
char *sf = s;
char ri = strlen((s) - 1);
char *sl = &s[ri];
for (i = 0; i < ri; i++){
if (*sf != *sl){
temp = *sf++;
s[i] = *sl--; //
s[ri--] = temp; //those two seems to be getting new characters, but it won't
}
else {
ri--;
sf++;
sl--;
}
}
printf("%s", s);
}
Run Code Online (Sandbox Code Playgroud) 通过使用该命令,我发现内存中的objdump地址包含 start the path ,并且由于 C 标准,该路径以一个字节结束。0x02a8/lib64/ld-linux-x86-64.so.20x00
因此,我尝试编写一个简单的 C 程序来打印这一行(我使用了 Denis Yurichev 所著的《RE for Beginners》一书中的示例 - 第 24 页):
#include <stdio.h>
int main(){
printf(0x02a8);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我很失望地得到了分段错误而不是预期的/lib64/ld-linux-x86-64.so.2输出。
我发现使用这样一个printf不带说明符或至少不带指针转换的“快速”调用很奇怪,所以我尝试使代码更自然:
#include <stdio.h>
int main(){
char *p = (char*)0x02a8;
printf(p);
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行后我仍然遇到分段错误。
我不相信这是因为内存区域受限而发生的,因为在书中,第一次尝试一切都很顺利。我不确定,也许还有那本书中没有提到的事情。
因此,需要一些清晰的解释来解释为什么每次我尝试运行程序时都会发生分段错误。
我正在使用最新的完全升级的 Kali Linux 版本。