c++에서 익셉션이 발생했을 때 (try~catch 구문에서) stack unwinding 과정을 거쳐 catch문으로 eip가 이동해 핸들러가 실행되게 되는데, 익셉션이 발생한 시점에서 바로 예외 핸들러가 실행되게 되면, 스택이나 레지스터가 제대로 세팅된 상태가 아니기 때문에 에러가 난다. 이를 방지하기 위해 DWARF(elf 디버깅 정보 저장)에 byte code로 eh_frame섹션에 저장되어 있다. 이 byte code들은 libc의 DWARF 인터프리터에 의해 실행된다.
DWARF 정보를 알기 위해 readelf -w [elf file name]과 같이 입력하면 된다.
flack3r@ubuntu:~/prob$ readelf -w echo
Contents of the .eh_frame section:
00000000 0000000000000014 00000000 CIE
Version: 1
Augmentation: "zR"
Code alignment factor: 1
Data alignment factor: -8
Return address column: 16
Augmentation data: 1b
DW_CFA_def_cfa: r7 (rsp) ofs 8
DW_CFA_offset: r16 (rip) at cfa-8
DW_CFA_nop
DW_CFA_nop
00000018 0000000000000024 0000001c FDE cie=00000000 pc=0000000000400610..00000000004006b0
DW_CFA_def_cfa_offset: 16
DW_CFA_advance_loc: 6 to 0000000000400616
DW_CFA_def_cfa_offset: 24
DW_CFA_advance_loc: 10 to 0000000000400620
DW_CFA_def_cfa_expression (DW_OP_breg7 (rsp): 8; DW_OP_breg16 (rip): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit11; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus)
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
00000040 000000000000001c 00000044 FDE cie=00000000 pc=0000000000400794..00000000004007c0
DW_CFA_advance_loc: 1 to 0000000000400795
DW_CFA_def_cfa_offset: 16
DW_CFA_offset: r6 (rbp) at cfa-16
DW_CFA_advance_loc: 3 to 0000000000400798
DW_CFA_def_cfa_register: r6 (rbp)
DW_CFA_advance_loc: 39 to 00000000004007bf
DW_CFA_def_cfa: r7 (rsp) ofs 8
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
여기서 CIE는 익셉션이 발생했을 때 공통적으로 실행되는 부분이고 FDE는 특정 예외 처리 부분이라고 한다.
DW_CFA_val_expression 에 대한 설명은 http://www.dwarfstd.org/doc/040408.1.html 에 있다.
'Reversing' 카테고리의 다른 글
vmware 디버깅 (0) | 2015.01.28 |
---|---|
peda 설치법 (0) | 2014.10.17 |
지뢰 찾기 핵 (1) | 2014.07.29 |
치트엔진을 활용한 환세취호전 핵 (2) | 2014.07.28 |
DLL Injection (1) | 2014.05.17 |