背景
1、代码
2、编译
1
| sudo gcc stack.c -o stack -m32
|
反调试
gdb
objudmp
1
| objudmp -d stack -M intel
|
栈特点
栈是一种线性存储的数据结构,由高地址向低地址增长。
其存在栈底和栈顶,栈对其中的数据元素有进栈和出栈的操作,遵循‘First In last Out’即FILO原则。
分析
1、main函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 0804842d <main>: 804842d: 8d 4c 24 04 lea ecx,[esp+0x4] 8048431: 83 e4 f0 and esp,0xfffffff0 8048434: ff 71 fc push DWORD PTR [ecx-0x4] // 8048437: 55 push ebp //将ebp压入栈 8048438: 89 e5 mov ebp,esp //将esp压入栈 804843a: 51 push ecx //将ecx压入栈 804843b: 83 ec 04 sub esp,0x4 //抬高栈帧,esp=esp-0x4 804843e: 83 ec 08 sub esp,0x8// 抬高栈帧 8048441: 6a 14 push 0x14 //压入参数20 8048443: 6a 0a push 0xa //压入参数10 8048445: e8 c1 ff ff ff call 804840b <Add> //调用Add函数 804844a: 83 c4 10 add esp,0x10 //调整栈帧 804844d: b8 00 00 00 00 mov eax,0x0 //清空eax 8048452: 8b 4d fc mov ecx,DWORD PTR [ebp-0x4] //将[ebp-0x4]内的数据赋给ecx 8048455: c9 leave //mov esp,ebp;pop ebp 8048456: 8d 61 fc lea esp,[ecx-0x4] //取[ecx-0x4]中的数据赋给esp 8048459: c3 ret //pop eip 804845a: 66 90 xchg ax,ax 804845c: 66 90 xchg ax,ax 804845e: 66 90 xchg ax,ax
|
2、Add函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 0804840b <Add>: 804840b: 55 push ebp //将ebp压入栈 804840c: 89 e5 mov ebp,esp //将esp压入栈 804840e: 83 ec 08 sub esp,0x8// 抬高栈帧 8048411: 8b 55 08 mov edx,DWORD PTR [ebp+0x8] //将[ebp+0x8]压入edx 8048414: 8b 45 0c mov eax,DWORD PTR [ebp+0xc] //将[ebp+0xc]压入eax 8048417: 01 d0 add eax,edx //将eax与edx中的内容相加赋给eax 8048419: 83 ec 08 sub esp,0x8 //抬高栈帧 804841c: 50 push eax //将eax压入栈 804841d: 68 e0 84 04 08 push 0x80484e0 //压入x+y= 8048422: e8 b9 fe ff ff call 80482e0 <printf@plt> //调用printf函数 8048427: 83 c4 10 add esp,0x10 //调整栈帧 804842a: 90 nop 804842b: c9 leave 804842c: c3 ret
|
3、图示
这是一张函数在栈中的调用过程图