gpt4 book ai didi

c - 修改有缓冲区溢出漏洞的C代码跳过代码

转载 作者:太空狗 更新时间:2023-10-29 15:40:35 24 4
gpt4 key购买 nike

<分区>

我试图找到一种方法来利用以下源代码中的缓冲区溢出漏洞,因此将跳过 printf("x is 1") 行:

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

void func(char *str) {
char buffer[24];
int *ret;
strcpy(buffer,str);
}

int main(int argc, char **argv) {
int x;
x = 0;
func(argv[1]);
x = 1;
printf("x is 1");
printf("x is 0");
getchar();
}

为此,我想修改“func”函数。我知道我将需要使用 ret 变量来将返回地址修改为刚好超过我想跳过的行,但我不确定如何实际执行此操作。有人有什么建议吗?

编辑:

通过使用 gdb,我能够在主函数中找到以下调用:

Temporary breakpoint 1, 0x00000000004005ec in main ()
(gdb) x/20i $pc
=> 0x4005ec <main+4>: sub $0x20,%rsp
0x4005f0 <main+8>: mov %edi,-0x14(%rbp)
0x4005f3 <main+11>: mov %rsi,-0x20(%rbp)
0x4005f7 <main+15>: movl $0x0,-0x4(%rbp)
0x4005fe <main+22>: mov -0x20(%rbp),%rax
0x400602 <main+26>: add $0x8,%rax
0x400606 <main+30>: mov (%rax),%rax
0x400609 <main+33>: mov %rax,%rdi
0x40060c <main+36>: callq 0x4005ac <func>
0x400611 <main+41>: movl $0x1,-0x4(%rbp)
0x400618 <main+48>: mov $0x4006ec,%edi
0x40061d <main+53>: mov $0x0,%eax
0x400622 <main+58>: callq 0x400470 <printf@plt>
0x400627 <main+63>: mov $0x4006f3,%edi
0x40062c <main+68>: mov $0x0,%eax
0x400631 <main+73>: callq 0x400470 <printf@plt>
0x400636 <main+78>: callq 0x400490 <getchar@plt>
0x40063b <main+83>: leaveq
0x40063c <main+84>: retq
0x40063d: nop

虽然,我对从这里去哪里感到困惑。我知道该函数将返回到 0x400611 行,我需要使其跳转到 0x400631,但我不确定如何确定要跳转多少位或我应该如何修改 ret 变量。

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