|  |
| |
| pwnnnt |
1.
스텍 에필로그가 끝나고 RET(pop eip, jmp eip)를 만날 때, 스택 최상단(esp)에는 해커가 바꿔놓은 함수 주소가 되어있겠죠. 그리고 함수 진입을 하며 프롤로그 과정을 마치면 새로운 스텍 프레임이 형성 됩니다.
만약 ret에 write의 plt 주소를 덮는다 가정하면 다음과 같습니다.
payload = plt["write"] | write함수의 RET(pop3ret) | write(argv1) | write(argv2) | write(argv3) | RTL될 함수 주소 | RTL. ret | .....
RET를 만나기전.
Low High
| RET | pop3ret | argv1 | argv2 | argv3 | RTL | pop.... [ret] | ....
|write.plt | pop3ret | argv1 | argv2 | argv3 | RTL | pop... [ret] |....
RET를 만나 Write 함수를 진입하였을 때.
Low High
| write() stack | SFP | pop3ret | ebp+8 | ebp + 12 | ebp + 16 | RTL | pop ....[ret]|....
| write() stack | SFP | pop3ret | argv1 | argv2 | argv3 | ......
ㅣㅁㄴ우리암누린ㅁ
설명하기 힘드네요...
해쿨러님 기다리시면 될 듯 합니다.. |
2017/03/31 |
|
| pwnnnt |
RET를 만나고 write()함수로 진입했을 때 최상단의 값이 pop3ret이 였지만, 프롤로그 과정을 거치면서 새로운 스택 프레임이 생겨나고, ebp+8로 인자를 받아오는겁니다. |
2017/03/31 |
|
| pwnnnt |
그리고 write()함수가 끝나면서 RET자리에 있는 pop3ret 을 만나 write 인자 3개를 pop으로 꺼내주고, 다음 실행 될 라이브러리 주소를 만나며 chain 이 되는겁니다. |
2017/03/31 |
|
| pwnnnt |
(사실 이 지식은 100% 제 주관적인 생각이며, 틀릴 가능성이 농후합니다.)
정답은 해쿨러님이 ...꺆 ><
2번은 저도 궁금하군요, 좋은 질문인 것 같습니다. |
2017/03/31 |
|
| pwnnnt |
제 경험상 read()함수 같은거는 크기로 받아들여서 \x00 바이트도 읽는 것 같습니다. |
2017/03/31 |
|
| vngkv123 |
ㅎㅎ 해쿨러님과 더불어 매번 답변 감사드립니다 ㅎㅎ |
2017/03/31 |
|
| pwnnnt |
흐,,, 아닙니다.
저도 이제 막 포너블 시작해서 틀린 정보일 수도 있습니다 ㅜㅜㅜ
거기다 설명도 너무 못해서ㅋㅋㅋㅋㅋㅋㅋ부끄럽네요. |
2017/03/31 |
|
| vngkv123 |
혼자 맨땅에 헤딩중인데 재미있으면서도 힘드네요 ㅜ ㅋㅋㅋㅋ |
2017/03/31 |
|
| pwnnnt |
열심히 하셔서 보기 좋네요 :D !!!!!
같이 힘내서 계속 공부해용 ! |
2017/03/31 |
|