我编写了这段代码,以查看是否可以通过x64中的格式字符串攻击来修改“ target”变量。
#include<stdio.h>
int target;
int main(int argc , char **argv)
{
printf(argv[1]);
printf("\n\nTarget variable is at: %p" , &target);
if(target)
printf("Target Modified!");
return 0;
}
由于x64中的每个单词的大小为8个字节,因此目标变量的地址必须以8个字节的形式写入。
但是,这里的问题是目标变量的地址是
0x555555755034(格式为0xAABBCCDDEEFF)
但是由于字长为8个字节,我必须将此地址写为
0x0000555555755034(格式为0x0000AABBCCDDEEFF)。
但是当我运行以下命令以查看目标变量在堆栈中的位置时,我看到它总是与其他一些十六进制数字一起出现,例如5ecdAABBCCDDEEFF。
./code $(python -c 'print "\x34\x50\x75\x55\x55\x55"+"-%p"*131')
为了使其形状正确,我尝试在目标地址之前添加两个“ \ 00”,例如
./code $(python -c 'print "\x34\x50\x75\x55\x55\x55\x00\x00"+"-%p"*131')
但是终端抱怨'\ x00'被终止,因为它终止了字符串。
所以我的问题是: 我该如何写一个看起来像0xAABBCCDDEEFF但与其他十六进制数字(如0xed4cAABBCCDDEEFF)一起出现的地址。
如果有人可以帮助我,我会很高兴。如果我不清楚您的情况,请发表评论!