기본 콘텐츠로 건너뛰기

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 ...

American Fuzzy Lop And Address Sanitizer

American Fuzzy Lop And Address Sanitizer Address Sanitizer(ASAN) 단지 gcc/clang에 -fsanitize=address 옵션을 추가하는 것으로 간단히 사용할 수 있지만 그 효과는 충분하다. Example Out Of Bounds Read #include <stdio.h> int main() { int a[ 2 ] = { 3 , 1 }; int i = 2 ; printf ( "%i\n" , a[i]); } 예제 파일을 OutOfBoundsRead.c 로 생성하고 ASAN 옵션을 지정하여 clang 으로 컴파일하자. clang -g -fsanitize = address -fno -omit -frame -pointer OutOfBoundsRead . c -o OutOfBoundsRead 생성된 OutBoundsRead 파일을 실행하면 다음과 같은 결과를 볼 수 있다. ================================================================= ==3678==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffc0ba87428 at pc 0x47b7db bp 0x7ffc0ba87390 sp 0x7ffc0ba87388 READ of size 4 at 0x7ffc0ba87428 thread T0 ==3678==WARNING: Trying to symbolize code, but external symbolizer is not initialized! #0 0x47b7da (/root/ASAN/OutOfBoundsRead+0x47b7da) #1 0x7faba0260f44 (/lib/x86_64-linux-gnu/libc.so.6+0x21f44) #2 0x...