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