提问人:Roee Toledano 提问时间:10/26/2023 更新时间:10/26/2023 访问量:53
在 C 语言中为堆栈溢出而苦苦挣扎
Struggling with stack overflowing in C
问:
我正在尝试堆栈溢出我编写的这个简单程序:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int win(){
printf("%s\n", "you overflowed this stack succesfully!");
return 0;
}
int main(int argc, char** argv){
char buffer[100];
strcpy(buffer, argv[1]);
return 0;
}
这是使用 GDB 的反汇编:
(gdb) disas main
Dump of assembler code for function main:
0x0000000000001163 <+0>: push %rbp
0x0000000000001164 <+1>: mov %rsp,%rbp
0x0000000000001167 <+4>: add $0xffffffffffffff80,%rsp
0x000000000000116b <+8>: mov %edi,-0x74(%rbp)
0x000000000000116e <+11>: mov %rsi,-0x80(%rbp)
0x0000000000001172 <+15>: mov -0x80(%rbp),%rax
0x0000000000001176 <+19>: add $0x8,%rax
0x000000000000117a <+23>: mov (%rax),%rdx
0x000000000000117d <+26>: lea -0x70(%rbp),%rax
0x0000000000001181 <+30>: mov %rdx,%rsi
0x0000000000001184 <+33>: mov %rax,%rdi
0x0000000000001187 <+36>: call 0x1030 <strcpy@plt>
0x000000000000118c <+41>: mov $0x0,%eax
0x0000000000001191 <+46>: leave
0x0000000000001192 <+47>: ret
End of assembler dump.
(gdb) disas win
Dump of assembler code for function win:
0x0000000000001149 <+0>: push %rbp
0x000000000000114a <+1>: mov %rsp,%rbp
0x000000000000114d <+4>: lea 0xeb4(%rip),%rax # 0x2008
0x0000000000001154 <+11>: mov %rax,%rdi
0x0000000000001157 <+14>: call 0x1040 <puts@plt>
0x000000000000115c <+19>: mov $0x0,%eax
0x0000000000001161 <+24>: pop %rbp
0x0000000000001162 <+25>: ret
End of assembler dump.
(gdb)
我的想法是将主函数的返回地址覆盖到 win() 的地址。我以为给出 100 个 NOP 操作码之类的参数(也尝试了更大和更小的数字),然后 win() 中第一行的地址会起作用,但我一直收到分段错误。
我的想法有问题吗?
这是我执行的命令(在 gdb 中):run $(perl -e 'print"\x90"x100 . "\x4911000000000000"')
注意:我在 x86 机器上,所以我向后写了地址,因为它的小端序
答: 暂无答案
评论