我正在尝试重现我从 Aleph One 的文章“为了乐趣和利润而粉碎堆栈”中读到的 stackoverflow 结果(可以在此处找到:http: //insecure.org/stf/smashstack.html)。
试图覆盖退货地址似乎对我不起作用。
C代码:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
//Trying to overwrite return address
ret = buffer1 + 12;
(*ret) = 0x4005da;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
拆机主要:
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004005b0 <+0>: push %rbp
0x00000000004005b1 <+1>: mov %rsp,%rbp
0x00000000004005b4 <+4>: sub $0x10,%rsp
0x00000000004005b8 <+8>: movl $0x0,-0x4(%rbp)
0x00000000004005bf <+15>: mov $0x3,%edx
0x00000000004005c4 <+20>: mov $0x2,%esi
0x00000000004005c9 <+25>: mov $0x1,%edi
0x00000000004005ce <+30>: callq 0x400564 <function>
0x00000000004005d3 <+35>: movl $0x1,-0x4(%rbp)
0x00000000004005da <+42>: mov -0x4(%rbp),%eax
0x00000000004005dd <+45>: mov %eax,%esi
0x00000000004005df <+47>: mov $0x4006dc,%edi
0x00000000004005e4 <+52>: mov $0x0,%eax
0x00000000004005e9 <+57>: callq 0x400450 <printf@plt>
0x00000000004005ee <+62>: leaveq
0x00000000004005ef <+63>: retq
End of assembler dump.
我已经硬编码了返回地址以跳过 x=1; 代码行,我使用了反汇编程序中的硬编码值(地址:0x4005da)。该漏洞利用的目的是打印 0,但实际上打印的是 1。
我有一种非常强烈的感觉,“ret = buffer1 + 12;” 不是返回地址的地址。如果是这种情况,我如何确定返回地址,是 gcc 在返回地址和缓冲区之间分配更多内存。