본문 바로가기
자격증/정보보안기사

ASM to C (1)

by 겸손하게 빚진자로, 밝게 인사 2014. 12. 10.
728x90

 

 

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 코드 ####

반응형