시스템 해킹

 1576, 1/79 회원가입  로그인  
   vngkv123
   RTL기법 질문

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1834 [복사]


공유라이브러리를 이용할때 system이나 execve같은 함수를 이용하게되는데

system함수를 이용할 때, 인자를 ebp+8값을 인자로 받는다는데

이게 시스템 함수가 실행될때의 ebp는 SFP쪽이 아닌 RET쪽으로 내려와 있는건가요?

  Hit : 3352     Date : 2017/03/23 03:25



    
pwnnnt RTL 기법은 Return to Library의 약자입니다.
즉, 프로그램의 RET 영역에 Library 주소를 넣어주는거죠. 여기까지는 쉽게 이해하셨을 것 같습니다.

Library를 포함한 모든 함수들은 'call 명령어'를 통해 프롤로그 과정을 거치고 새로운 스택 프레임이 생겨나면 인자를 ebp+8의 주소에서 받아옵니다.
call 명령어를 풀어서 쓰게되면 push eip / jmp func() 입니다.

하지만 RTL기법은 call이 아닌 RET영역에 func()주소를 넣어 호출하기 때문에 pop eip / jmp eip 과정을 거치게 됩니다.
그렇기 때문에 RTL로 원하는 인자를 전달해주기 위해서는 RET+8에 인자 주소를 넣으셔야 됩니다.
그러면 당연히 RET+4에는 func()의 RET가 되겠죠 ?
2017/03/24  
pwnnnt RET+4에 다른 func()주소를 넣으면서 연속해서 함수를 호출하는 기법이 RTL Chain 이 되는겁니다. 2017/03/24  
pwnnnt 혹시 잘못된 지식이 있으면 짚어주세요 ;ㅁ; 2017/03/24  
해쿨러 윗분도 정확하게 설명해주셨는데,
call로 함수를 호출하느냐 ret으로 함수를 호출하느냐의 문제입니다
[dummy] + [ret] + "AAAA", "BBBB"
일 때 AAAA가 인자로 들어가느냐 BBBB가 인자로 들어가느냐인데
함수의 맨 첫인스트럭션을 eip가 가르키는 순간의 esp를 기준으로 인자는 원래 어디있어야 하는가를 알면 됩니다

push arg2
push arg1
call func
을 실행하면 함수의 맨 첫 인스트럭션에서 esp는
[ret] [arg1] [arg2]
ret을 가르키고 있습니다

RTL을 하면
[dummy] + [ret] + "AAAA" + "BBBB" 일 때
RET명령어는 pop %eip와 같으니 RET을 수행하면 ret는 eip로 들어가고 esp는 "AAAA"를 가르키게 됩니다. 그리고 그 순간은 함수의 맨 첫인스트럭션 주소가 eip에 있는 순간이죠
그래서 "AAAA"자리가 [ret]에 들어간 함수의 리턴어드레스자리, "BBBB"가 첫번째인자 자리가 됩니다
2017/03/24  
pwnnnt 굳굳,, 명쾌한 답변입니다.
역시 해쿨러님 bb
2017/03/24  
vngkv123 오졋습니다 여러분 항상 감사합니다 2017/03/24