리버싱/모두를 위한 리버싱 지침서 요약

1장 1.4 리턴값 x86

상세 2022. 5. 15. 19:29

주의 : 혼자 공부중이여서 틀린 내용이 있을수도 있습니다. 그럴 경우에 언제든지 말씀해주세요!


 

예제1 C코드

어셈블리1 코드

2~3행 : 함수의 프롤로그이다. 원래 sub esp, ? 가 되어야 하는데, main함수에는 변수가 없기 때문에 없는듯 하다.

4행 : eax레지스터에 리턴값 10을 저장한다. 이건 리턴값을 저장하기 위해 수행된다.

5행 ~ 6행 : 함수의 에필로그이다. ret 명령어는 함수 호출자로 리턴값을 리턴한다. <- 이 말이 무슨 말인지 몰라서 간단한 함수를 하나 새로 만들어서 이해해보았다.

 


func() 설명 : a라는 지역변수를 선언해서 100이란 값을 저장하고 그 a값을 리턴하는 매우 단순한 함수.

1행 : 무엇인지 확실하지는 않다. 보아하니 func()함수의 지역변수명과 이름이 같으니 그 함수의 지역변수를 나타내고, -4는 4byte를 차지한다고 4인것 같다.

2행 : _func로 함수의 이름을 알려준다.

3~4행 : 함수의 프롤로그

5행 : a변수를 나타내는 ecx레지스터를 스택에 넣는다. <-이 부분은 잘 모르겠다. 

6행 : 변수 a의 주소에 100이라는 값을 넣는다.

7행 : 리턴값을 저장할 eax레지스터에 리턴값인 a의 주소값을 저장한다.

8~10행 : 함수의 에필로그이다. 마지막 10행은 함수 호출자(C언어 12행의 func()인듯?)로 리턴값이 저장되어있는 eax의 값을 전달한다.

11행 : func()함수가 끝남을 알려준다.

13행 : 확실하진 않은데, main()함수의 지역변수를 적어뒀고, 4바이트라 -4인것 같다.

14행 : 함수명을 알려준다.

15~16행 : 함수의 프롤로그

17행 : b의 값에 대응되는 ecx레지스터를 스택에 넣음으로써 선언한다?

18행 : func()함수를 호출한다.

19행 : b의 주소값(스택의 가장 밑에 있으니 ebp가 주소에 func()의 리턴값을 저장한다. 리턴값 = 100

20행 : main함수의 리턴값 10을 eax에 저장한다. 

21~22행 : 함수의 에필로그

23행 : 리턴값을 함수 호출자로 리턴한다.

24행 : main()함수의 끝나는 지점

'리버싱 > 모두를 위한 리버싱 지침서 요약' 카테고리의 다른 글

1.7 스택  (0) 2022.05.29
1.6 함수 프롤로그와 에필로그  (0) 2022.05.18