我想重現從Aleph One的文章「粉碎堆棧獲得樂趣和利潤」(可在此處找到:http://insecure.org/stf/smashstack.html)讀取的stackoverflow結果。試圖粉碎堆棧
試圖覆蓋返回地址似乎不適用於我。
的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 <[email protected]>
0x00000000004005ee <+62>: leaveq
0x00000000004005ef <+63>: retq
End of assembler dump.
我已硬編碼的返回地址跳過在x = 1;代碼行,我使用了反彙編器的硬編碼值(地址:0x4005da)。這個漏洞的意圖是打印0,但它是打印1.
我有一個非常強烈的感覺,「ret = buffer1 + 12;」不是返回地址的地址。如果是這種情況,我怎麼才能確定返回地址,gcc是在返回地址和緩衝區之間分配更多的內存。
我不能用這個方法,因爲我使用的是linux和GNU GCC。 –
@Mike,實際上你可以使用_method_,因爲'gcc'也提供內聯'asm'。您只需將其轉換爲替代語法即可。 – paxdiablo