|  |
| |
| 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 |
|