기본 콘텐츠로 건너뛰기

Insecure-programming-abo2

Insecure-programming-abo2

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.

exit() 함수 종료 로직 프로그램 공격 기법 참고 자료

전체 목록 보기 : 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`

이 블로그의 인기 게시물

Remove-Server-Header

응답 메시지 내 서버 버전 정보 제거 1. Apache 1) 조치 방법 “/etc/htpd/conf/httpd.conf” 파일 안에서 1. ServerTokens OS → ServerTokens Prod 2. ServerSignature On → ServerSignature Off 로 변경한 후 아파치를 재시작하면 헤더 값의 아파치 버전 정보 및 OS 정보를 제거할 수 있다. 2) 참고 URL http://zetawiki.com/wiki/CentOS_ 아파치_보안권장설정_ServerTokens_Prod,_ServerSignature_Off 2. IIS 1) 조치 방법 IIS 6.0 urlscan_setup 실행. 설치. \windows\system32\inetsrv\urlscan\urlscan.ini 파일을 열어 다음 수정(RemoveServerHeader=0 을 RemoveServerHeader=1 로 변경) 서비스에서 IIS Admin Service 재시작. IIS 7.0 IIS 관리자를 열고 관리하려는 수준으로 이동합니다. 기능 보기에서 HTTP 응답 헤더를 두 번 클릭합니다. HTTP 응답 헤더 페이지에서 제거할 헤더를 선택합니다. 작업 창에서 제거를 클릭하고 예를 클릭합니다. 2) 참고 URL IIS 6.0 : http://gonnie.tistory.com/entry/iis6- 응답헤더-감추기 IIS 7.0 : https://technet.microsoft.com/ko-kr/library/cc733102(v=ws.10).aspx 3. jetty 1) 조치 방법 “jetty.xml” 파일에서 jetty.send.server.version=false 설정 2) 참고 URL http://attenuated-perspicacity.blogspot.kr/2009/09/jetty-61x-hardening.html 4. Nginx ...

데일 카네기 인간관계론 정리

Insecure-programming-abo1

Insecure-programming-abo1 Insecure Programming by example Advanced Buffer Overflow 1 int main ( int argv , char * * argc ) { char buf [ 256 ] ; strcpy ( buf , argc [ 1 ] ) ; } Advanced Buffer Overflow 첫 번째 문제는 사용자 인자 값 검증 없이 버퍼에 strcpy() 함수로 복사하여 발생되는 오버플로우 예이다. 먼저 objdump 를 이용하여 어셈블리어를 살펴보자. # objdump -d -M intel ./abo1 | grep -A 16 "<main>" 08048374 <main>: 8048374: 55 push ebp 8048375: 89 e5 mov ebp,esp 8048377: 81 ec 18 01 00 00 sub esp,0x118 804837d: 83 e4 f0 and esp,0xfffffff0 8048380: b8 00 00 00 00 mov eax,0x0 8048385: 29 c4 sub esp,eax 8048387: 8b 45 0c mov eax,DWORD PTR [ebp+12] 804838a: 83 c0 04 add eax,0x4 804838d: 8b 00 mov eax,DWORD PTR [eax] 804838f: 89 44 24 04 mov ...