Dump of assembler code for function main: 0x0804841c <+0>: push ebp 0x0804841d <+1>: mov ebp,esp 0x0804841f <+3>: sub esp,0x10 // 지역변수가 선언되면 스택을 할당한다. ; init (0x10) 0x08048422 <+6>: mov BYTE PTR [ebp-0x1],0x61 ; ebp = 0x61 0x08048426 <+10>: movsx edx,BYTE PTR [ebp-0x1] 0x0804842a <+14>: movsx eax,BYTE PTR [ebp-0x1] ; edx = 1 ; eax = 1 0x0804842e <+18>: mov DWORD PTR [esp+0x8],edx 0x08048432 <+22>: mov DWORD PTR [esp+0x4],eax 0x08048436 <+26>: mov DWORD PTR [esp],0x80484e0 0x0804843d <+33>: call 0x80482f0 <printf@plt> // elf의 ptl과 got ; print ( eax, edx ) 0x08048442 <+38>: mov eax,0x0 ; return 0 0x08048447 <+43>: leave // 지역변수가 선언되면 종료 시 leave 명령어 사용한다. 0x08048448 <+44>: ret End of assembler dump. |
#### 개념 ####
movzx(move zero extend) :
제로확장이란 안에 들어 있는 모든 값들을 0으로 초기화 시키는 것
movsx(move sign extend) :
movzx의 부족한 부분을 메우기 위해 나온 명령어
부호가 있는 변수를 작은 크기의 데이터에서 큰 데이터로 이동시키기 위한 명령어
movsx는 '1'로 초기화 한다.
데이터 값이 부호가 있거나, 음수인 것을 표시하기 위해 1로 채움
참고 : http://reverseengine.tistory.com/entry/%EC%A0%9C-13%ED%8E%B8-Movzx-Movsx
leave : leave명령 수행 결과로 ebp값이 이전 함수의 ebp값을 돌려받는다.
mov ebp, esp
pop ebp
이 두 명령을 수행한다.
참고 : http://research.hackerschool.org/Datas/Research_Lecture/sfp.txt
C코드를 컴파일하고 readelf -S <실행파일> 명령을 통해 Section Header를 볼 수 있다.
.plt와 .got.plt 가 보인다.
.plt섹션은 Procedure Linkable Table의 약자로 함수들 링크가 가능한 테이블로 프로그램이 호출하는 모든 함수가 나열되어 있다.
.got.plt 는 Global Offset Table로 전역 offset을 가지는 테이블이다.
프로그램을 따라가 보면 printf 실제 링크 주소가 아닌 plt 영역으로 들어오게 된다.
<printf@plt+11>은 printf의 주소가 got에 저장되어 있지 않기 때문에 dl_runtime_resolve 함수를 수행하는 부분이다.
점프를 따라가 보면 .got.plt 영역으로 점프하게 된다.
elf는 윈도우 PE 파일과 다르게 호출되는 함수 주소를 한번에 다 올리는 것이 아니라 프로그램 실행 시 호출될 때마다 라이브러리 주소를 got에 넣고, 다시 printf를 호출할 때는 이미 앞서 got에 저장된 printf의 라이브러리 주소를 가져와서 printf를 호출한다.
참고 : http://ezbeat.tistory.com/374
#### C 코드 ####
'자격증 > 정보보안기사' 카테고리의 다른 글
[정보보안기사 실기] 시스템보안③ (0) | 2016.04.18 |
---|---|
[정보보안기사 실기] 시스템보안② (0) | 2016.04.17 |
[정보보안기사 실기] 시스템보안① (0) | 2016.04.16 |
gdb 명령어 (0) | 2014.12.10 |
리버싱 공부 (0) | 2014.12.09 |