我想要复现Aleph One在文章“smashing the stack for fun and profit”中提到的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在返回地址和缓冲区之间分配了更多的内存吗?
gcc
也提供了内联asm
。你只需要将其转换为替代语法即可。 - paxdiablo