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 |