ghkdtlwns987

RTL 원리 (Dummy 를 넣어주는 이유?) 본문

시스템

RTL 원리 (Dummy 를 넣어주는 이유?)

2020/03/31 2020. 12. 11. 23:22

시험기간이고, 시험 3일 남았는데, 멘탈 터져서 유튜브 보던 중,

RTL 에 대해 물어보는 사람이 있어서 설명 해 준 김에 글을 적어보았다. ㅎㅎ

 

꽤 많은 사람들이 RTL을 설명할 때 왜 Dummy 값을 넣어주어야 하는지 모르는 사람이 꽤 있는거 같아서 글을 써보고자 한다. (Dummy 에 들어가는 곳은 RET 에 넣어준 함수가 종료된 후 호출하는 주소 라는 정도만 알고있는 것 같다.)

 

RTL 에서 Dummy() 값에 왜 넣어주는지, 이유가 무엇인지, 한번 알아보도록 하자. 

 

사실 이러한 원리는 스택 구조를 알아야 한다. 

그 전에 leave, ret, call 명령어가 무엇을 의미하는지 보고 넘어가겠다. 

leave =  mov esp ebp
         pop ebp

ret   =  pop eip 
         jmp eip

call  =  push eip
         jmp Address

위의 어셈블리 명령어들이 무엇을 의미 하는지 알아두도록 하자. 

 

자! 그럼 본격적으로 RTL의 원리에 대해 공부해 보도록 하겠다.

 

1. 정상적인 함수 호출 

다음 그림을 보면 함수가 정상적으로 call func() 어셈블리 명령어를 통해

func() 의 RET 에 다시 main() 함수의 eip 주소가 들어갔다.

 

그렇다면 main() 함수의 RET 에 system()함수를 넣어주고, 그 뒤에 아무것도 넣어주지 않았으면?

비 정상적인 함수 호출 1

 

다음으론 RTL 기법대로 값을 넣은 값을 그림으로 표현해 보겠다.

다음과 같이 RET 에 system() 만 넣었을 시 보이는 결과이다. 

call 명령어(push eip , jmp addr) 가 없다 보니,

system() 함수가 종료되고 난 후의 RET 은 ? 로 어딜 가리킬 지 모르고 있다. 

 

다음을 보면 Dummy() 에 puts() 를 넣어주었기 때문에, RET 에 정상적으로 puts 가 들어간 것을 볼 수 있다.

 

여태껏 그림으로 봤으니 대충은 감이 왔다고 생각하겠다.

다시한번 짚고 넘어가자면

 

정상적인 함수호출      -> call 명령어(push eip, jmp addr) 사용

비 정상적인 함수 호출 -> call 명령어 사용 X (RET 에 바로 함수 주소를 넣어버림)

 

+ call 명령어는 push eip , jmp addr() 명령어가 합해진 거라고 봐도 무방한데, 

여기서 push eip 가 다음에 실행할 함수의 RET 에 저장된다. 

 

★여기서 머리가 복잡해 질 수 있으니 조급해하지말고 천천히 생각해보자. 스택은 아래에서부터 위로 증가한다. 

    마찬가지이다. push eip 로 RET 이 함수의 맨 밑에 존재한다. 

=> 이를 통해서 RTL_chaining , ROP 와 같은 기법에 연계할 수 있다. 

 

+ 여기서 Dummy() 다음에 '/bin/sh' 는 왜 system() 함수의 인자로 들어가게 되는지?? 궁금해 할 수 있다.

그것과 관련된 대답은 '함수마다 다르다' 이다. 그 이유는 다음과 같다. 

system() 함수를 호출하는데, call system 을 하기 전, 그 위의 어셈블리 코드를 보면 

mov ebp - 0x4, ebx 어쩌고 할 거다(예를 들자면)(그냥 생각나는대로 바로 적음)(직접 확인해보길 바란다.)

쨋든 값을 추가로 덮게 되면 system() 함수가 인자로 받는 부분도 덮을 수 있기 때문이다. 

만약 scanf() 함수를 사용한다면 인자로 3개를 주어야 할 것이다.(그렇다고요...)

 

 

여담) RTL 을 그냥 쓸줄만 알지, 이러한 원리를 아는 사람은 은근 적다.

기왕쓰는거 원리를 짚고가는게 좋을 거 같아 이렇게 글을 쓰게 되었다. (물어보는 사람이 있어서... ㅎㅎ)

쨋든 RTL을 이해한다는 것은 스택 프롤로그, call 함수, RET 이 어떻게 생성되는지 안다는 것이고,

스택이 동작하는 과정을 이해한다는 것과 같다. 

 

모두 파이팅~ 

'시스템' 카테고리의 다른 글

시스템 해킹 공부 순서  (5) 2020.12.28
[Vmware] 하드용량 늘리기  (0) 2020.12.27
[시스템] dl_fini  (0) 2020.11.18
[시스템] 쉘 코드 모음  (0) 2020.11.16
stdout 으로 libc leak  (3) 2020.11.10
Comments