gpt4 book ai didi

c++ - 为什么 GDB 中的一些内存地址看起来比其他的短?

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:21 25 4
gpt4 key购买 nike

为什么 GDB 中的一些内存地址看起来比其他的短?

在我学校的一门课上,我得到了这段代码,并要求我输入文本,以便对其执行缓冲区溢出攻击,使其打印“你赢了!”当我运行它时。这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

void win() {
printf( "You Won!");
}
void lose() {
printf( "You lost!");
}
int check(char* name) {
char buffer[16];

strcpy( buffer, name );

printf( "Your name is: %s \n", buffer);
printf( "The buffer address is [%p].\n", &buffer );
// Call the random function
srand(time(NULL));

return rand();
}
int main(int argc, char **argv) {
int randnum;
randnum = check(argv[1]);
if(randnum < 5) {
win();
} else {
lose();
}

// Return everything is OK
return( 0 );
}

我使用 gcc -g -m32 -fno-stack-protector Vulnerable.cpp 编译了这个

为了找到 strcpy 的返回地址,我使用 GDB 查看堆栈并看到内存已满,直到我在输出中收到此错误,所以我知道返回地址已覆盖返回地址:

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()

为了编写使它运行 win() 的漏洞,我知道我需要用与 win() 关联的内存地址替换输入中的那些 B。为了找到这个地址,我反汇编了 main 并找到了对 win 的调用以及与之关联的内存地址:

   0x00001ed7 <+55>:    call   0x1db0 <win()>

为什么内存地址 0x1db0 会这样显示?不应该是 0x00001db0 吗?

此外,如果有人能解释我如何在输入的末尾写入该地址以使其返回 win 函数,那就太棒了。

我对完成这项任务的方向有些迷茫,因此我们将不胜感激。

最佳答案

x86 指令集有几种不同的 CALL 变体。采用不同参数大小的指令。 16位相对地址的CALL可用于调用地址与调用点相近的函数。

关于c++ - 为什么 GDB 中的一些内存地址看起来比其他的短?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com