gcc常用的编译选项对代码的影响

2008-04-09 04:00:06来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

gcc常用的编译选项对代码的影响

Author: alert7
Email: alert7@whitecell.org
Homepage:http://www.whitecell.org



测试环境 redhat 6.2

★ 前言

本文讨论gcc的一些常用编译选项对代码的影响。当然代码变了,
它的内存布局也就会变了,随之exploit也就要做相应的变动。
gcc的编译选项实在太多,本文检了几个最常用的选项。


★ 演示程序

[alert7@redhat62 alert7]$ cat > test.c
#include <stdio.h>
void hi(void)
{
printf("hi");
}

int main(int argc, char *argv[])
{
hi();
return 0;
}


★ 一般情况

[alert7@redhat62 alert7]$ gcc -o test test.c
[alert7@redhat62 alert7]$ wc -c test
11773 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483e4 <main>: push 雙
0x80483e5 <main 1>: mov %esp,雙
0x80483e7 <main 3>: call 0x80483d0 <hi>
0x80483ec <main 8>: xor 陎,陎
0x80483ee <main 10>: jmp 0x80483f0 <main 12>
0x80483f0 <main 12>: leave
0x80483f1 <main 13>: ret
....
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483d0 <hi>: push 雙
0x80483d1 <hi 1>: mov %esp,雙
0x80483d3 <hi 3>: push $0x8048450
0x80483d8 <hi 8>: call 0x8048308 <printf>
0x80483dd <hi 13>: add $0x4,%esp
0x80483e0 <hi 16>: leave
0x80483e1 <hi 17>: ret
0x80483e2 <hi 18>: mov %esi,%esi
End of assembler dump.

来看看部分的内存映象
(内存高址)
--------
|bffffbc4| argv的地址(即argv[0]的地址)
0xbffffb84 --------
|00000001| argc的值
0xbffffb80 --------
|400309cb|main的返回地址
0xbffffb7c -------- <-- 调用main函数前的esp
|bffffb98| 调用main函数前的ebp
0xbffffb78 -------- <-- main函数的ebp
|080483ec| hi()的返回地址
0xbffffb74 --------
|bffffb78| 调用hi()前的esp
0xbffffb70 --------
|08048450| "hi"的地址
0xbffffb6c --------
| ...... |
(内存低址)

leave 指令所做的操作相当于MOV ESP,EBP 然后 POP EBP
ret 指令所做的操作相当于POP EIP


★ -O 编译选项

With `-O', the compiler tries to reduce code size and execution time.
When you specify `-O', the two options `-fthread-jumps' and
`-fdefer-pop' are turned on
优化,减少代码大小和执行的时间

[alert7@redhat62 alert7]$ gcc -O -o test test.c
[alert7@redhat62 alert7]$ wc -c test
11757 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483d8 <main>: push 雙
0x80483d9 <main 1>: mov %esp,雙
0x80483db <main 3>: call 0x80483c8 <hi>
0x80483e0 <main 8>: xor 陎,陎
0x80483e2 <main 10>: leave
0x80483e3 <main 11>: ret
0x80483e4 <main 12>: nop
...
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483c8 <hi>: push 雙
0x80483c9 <hi 1>: mov %esp,雙
0x80483cb <hi 3>: push $0x8048440
0x80483d0 <hi 8>: call 0x8048308 <printf>
0x80483d5 <hi 13>: leave
0x80483d6 <hi 14>: ret
0x80483d7 <hi 15>: nop
End of assembler dump.

在main()中,把一条jmp指令优化掉了,很显然,这条指令是可以不需要的。
在hi()中,把add $0x4,%esp优化掉了,这会不会使stack不平衡呢?
来看看部分的内存映象
(内存高址)
--------
|bffffbc4| argv的地址(即argv[0]的地址)
0xbffffb84 --------
|00000001| argc的值
0xbffffb80 --------
|400309cb|main的返回地址
0xbffffb7c -------- <-- 调用main函数前的esp
|bffffb98| 调用main函数前的ebp
0xbffffb78 -------- <-- main函数的ebp
|080483e0| hi()的返回地址
0xbffffb74 --------
|bffffb78| 调用hi()前的esp
0xbffffb70 --------
|08048440| "hi"的地址
0xbffffb6c --------
| ...... |
(内存低址)

leave 指令所做的操作相当于把MOV ESP,EBP 然后 POP EBP

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:编写感染COM与EXE文件的病毒的样例程序

下一篇:书写基于内核的linux键盘纪录器(p9-0e)