Insecure Programming by example
Advanced Buffer Overflow 2
int main(int argv, char **argc) {
char buf[256];
strcpy(buf, argc[1]);
exit(1);
지난번 Advanced Buffer Overflow 1 문제와는 다르게 exit()
함수가 추가된 것을 볼 수 있다.
이번 문제는 x86 시스템에서 exit()
함수 호출과 익스플로잇에 대한 영향을 살펴보는 것이 목적이다.
objdump
를 이용하여 어셈블리어를 살펴보면 한 가지 특징을 볼 수 있다.
# objdump -d -M intel ./abo2 | grep "<main>" -A 16
080483b4 <main>:
80483b4: 55 push ebp
80483b5: 89 e5 mov ebp,esp
80483b7: 81 ec 18 01 00 00 sub esp,0x118
80483bd: 83 e4 f0 and esp,0xfffffff0
80483c0: b8 00 00 00 00 mov eax,0x0
80483c5: 29 c4 sub esp,eax
80483c7: 8b 45 0c mov eax,DWORD PTR [ebp+12]
80483ca: 83 c0 04 add eax,0x4
80483cd: 8b 00 mov eax,DWORD PTR [eax]
80483cf: 89 44 24 04 mov DWORD PTR [esp+4],eax
80483d3: 8d 85 f8 fe ff ff lea eax,[ebp-0x108]
80483d9: 89 04 24 mov DWORD PTR [esp],eax
80483dc: e8 e3 fe ff ff call 80482c4 <strcpy@plt>
80483e1: c7 04 24 01 00 00 00 mov DWORD PTR [esp],0x1
80483e8: e8 e7 fe ff ff call 80482d4 <exit@plt>
80483ed: 90 nop
exit()
함수가 main 함수로 반환되지 않고 종료된다는 것이다. 다시 말해 main 함수는 exit()
함수를 호출하는 것으로 그 내용이 끝난다. 따라서 exit()
함수 동작 후 main 함수의 반환 주소를 조작해서 오버 플로우 공격을 수행하는 것을 불가하다.
exit()
함수를 확인해보면 _exit()
함수를 호출하는 것을 확인할 수 있다.
0xb7ec599a <exit+170>: mov 0x8(%ebp),%eax
0xb7ec599d <exit+173>: mov %eax,(%esp)
0xb7ec59a0 <exit+176>: call 0xb7f291e4 <_exit>
_exit()
함수는 sys_exit
시스템 콜을 요청하여 프로세스를 종료하는 코드가 있는 것을 확인할 수 있다.
(gdb) disas _exit
Dump of assembler code for function _exit:
0xb7f291e4 <_exit+0>: mov 0x4(%esp),%ebx
0xb7f291e8 <_exit+4>: mov $0xfc,%eax
0xb7f291ed <_exit+9>: call *%gs:0x10
0xb7f291f4 <_exit+16>: mov $0x1,%eax
0xb7f291f9 <_exit+21>: int $0x80
0xb7f291fb <_exit+23>: hlt
End of assembler dump.
전체 목록 보기 : Insecure programming
진행 환경 :# cat /proc/version
Linux version 2.6.20-15-generic (root@palmer) (gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)) #2 SMP Sun Apr 15 07:36:31 UTC 2007`