私はAleph Oneの記事「fun and profitのためにスタックを粉砕しています」(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);
}
メイン分解:私は硬X = 1をスキップする復帰アドレスを符号化している
(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.
。コードライン、私は逆アセンブラ(アドレス:0x4005da)からハードコードされた値を使用しています。この悪用の意図は、0を印刷することですが、代わりに1を印刷しています。
「ret = buffer1 + 12;」という非常に強い気持ちがあります。戻りアドレスのアドレスではありません。この場合、どのように返信アドレスを決定すればいいですか?返信アドレスとバッファの間にさらに多くのメモリを割り当てていますか?
私はこの方法を使用することはできませんなぜなら、私はLinuxとGNU GCCを使用しているからです。 –
@Mike、実際には 'gcc'もインライン' asm'を提供するので、_method_を使うことができます。代わりの構文に変換するだけです。 – paxdiablo