시스템 해킹

 1576, 1/79 회원가입  로그인  
   vngkv123
   리턴과 관련한 질문....

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


1) 일반적인 RTL시, 공유라이브러리 함수주소를 가져와서 ret에 넣고 하는데.... 일반적인 call호출과 ret에 함수주소를 가져왓을 때 exec*나 system같은 함수들이 ebp+8을 참조하게 되는데... 어떻게 진행이 되어서 ret에 ebp가 자리잡게되어서 거기로부터 참조를 하는건가요? 이럴 때 인자참조는 전부 +8을 기준으로 가져오나요?

2) 위와 같은 RTL을 막기위해 ASCII ARMOR가 고안된걸로 알고 있는데...
널바이트는 문자열의 끝으로 인식해서 더이상 진행ㅇ이 안되서 막히는걸로 알고 있네요ㅠ 근데 fake ebp나 다른 기법을 보면 상위1바이트가 널바이트인데도 뒤의 페1이로드가 그대로 진행이 되더라구요. 왜 그런거죠?

  Hit : 3034     Date : 2017/03/30 11:08



    
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