본문 바로가기

system

ctors, dtors section

GNU Compiler 는 컴파일 시 .ctors, .dtors section 을 생성한다.

 

.ctors 속성의 함수는 main() 전에 실행되고, .dtors 속성의 함수는 main() 종료 후에 실행된다.

따라서, main() 종료 후 .dtors 함수가 실행된다는 점을 이용해, 이 부분을 조작한다면 eip 를 control 할 수 있다.

 

 

간단하게 테스트 해보자.

 

 __attribute__((constructor))    : .ctors   

 __attribute__((destructor))     : .dtors

constructor 속성의 함수는 main() 전에 실행되고, destructor 속성의 함수는 main() 종료 후 실행된다.

 

위의 소스코드를 Compile 후 실행시켰을 때,

 

./test

# [*] ctors function

# [*] main function

# [*] dtors function

다음과 같은 결과가 나온다. 즉, f_ctors() -> main() -> f_dtors() 순서대로 함수가 수행되는 것을 확인할 수 있다.

 

gdb 를 통해 분석해보면,

(gdb) x/x 0x08049604

0x08049604 <__CTOR_LIST__> :    0xffffffff

(gdb) x/x 0x08049608

0x08049608 <__CTOR_END__> :    0x00000000

다음과 같은 구조로 되어있다. 마찬가지로 .dtors 구조 또한 동일하다. 

 

만약 위의 예제 소스와 같이 attribute로 함수를 추가했다면,

(gdb) x/3x &__CTOR_LIST__

0x0804953c <__CTOR_LIST__> :    0xffffffff    0x08048328    0x00000000

(gdb) x/i 0x08048328

0x08048328 <f_ctors> :    push    ebp

다음과 같이 __CTOR_LIST__ 와 __CTOR_END__ 사이에 f_ctors() 함수가 추가된 것을 확인할 수 있다. (.dtors section 동일)

 

※ FSB 공격을 할 때 .dtors+4 영역을 쉘코드가 담긴 환경변수의 주소나 원하는 주소를 덮어쓰게 되는데 attribute를 추가했다면 그 함수의 주소를 덮어씌우게 되고, 추가해준 함수가 없다면 __DTOR_END__ 를 덮어씌우게 된다.

 

'system' 카테고리의 다른 글

stdin 임시버퍼  (0) 2016.10.11
LD_PRELOAD  (0) 2016.10.05
core dump 생성  (0) 2016.07.28
fake ebp 기법  (0) 2016.05.31
difference system call and library function  (0) 2016.04.17