ImFe's study

어셈블리 코드 해석 본문

Reversing

어셈블리 코드 해석

ImFe 2020. 4. 12. 22:36

해석하게될 코드

 

 

 

스택 프로텍터들을 사용하지 않는 옵션들입니다.

 

 

프로그램 동작에 따른 스택의 변화는 대강

버퍼
변수c
EBP(RBP)
RET

 

이렇게 main함수에서 sum()을 호출한 이후

버퍼
RBP
RET
변수 = 2
변수 = 1
버퍼
변수c
EBP
RET

 

버퍼 위에 스택이 쌓이게됩니다.

매개변수들은 RET 아래에 들어가게됩니다.
또한 sum을 다 실행하면 RET를 통해 변수1부터 최상단 버퍼가 사라집니다(POP)


더 자세히 알아보면

main 함수가 불러와지자 ret가 일단 자리를 잡습니다.

 

main:

push %rbp를 통해 rbp를 지정합니다.

mov %rsp, %rbp // %rsp=%rbp

sub $16, %rsp  //rsp에서 16만큼을 뺍니다. = 16만큼 확보후 코드를 작성할 계호기

mov $2 %esi //esi에다가 2를 넣습니다.

mov $1 %edi //edi에다가 1을 넣습니다

call sum //sum을 불러옵니다.

 

sum:

함수단에서 push %rbp로 인해 ret위에 rbp가 올라갑니다.

mov %edi -4(%rbp)=> rbp-4값에 edi값을 넣습니다. (절대위치상승)

=>EDI 값은 원래 1이였으니까 rbp에서 -4위치에 EDI를 MOV

 

mov %esi -8(%rbp) => rbp-8 위치에 esi 값을 넣습니다. (절대위치 상승)

=esi값은 원래 2였으니까 rbp에서 -8위치에 ESI mov

 

mov -4(%rbp), %edx // rbp-4에 위치한 1값을 EDX에 넣어줌.

mov -8(%rbp), %eax // rbp-8에 위치한 2값을 EAX에 넣어줌

 

add edx,eax  //edx의 값을 eax에 더해줌

 

//eax=3  (특정 함수가 끝날때 반환값을 가지고 있는 레지스터)

 

pop rbp=>원래값으로 돌아감. ret로 간다

다시 main함수로 돌아가서..

mov %eax, -4(%rbp)  // eax값을 rbp-4에 둠

 

leave

 

ret

 

최종적으로 3이라는 값이 반환됩니다.

 

 

Comments