JMP-CALL-POP 기술
점프, 콜, 팝 기술은 매우 중요합니다. 중요한 이유는 자신이 작성한 코드를 실행시킬 수 있기 때문이죠.
앞 포스팅에서 HelloWorld가 실행되지 않았는데, 이 것을 JMP-CALL-POP을 이용해서 실행이 되도록 해보겠습니다.
JMP-CALL-POP 변경
JMP-CALL-POP를 이용하여 소스코드를 수정했습니다.
왜 이러한 방식으로 소스코드를 작성 했을까요? 소스코드 분석을 해보도록 하겠습니다.
5 : call_shellcode로 점프합니다.
25: shellcode를 호출합니다.
※ 왜 jmp를 이용해서 넘어가도 되는데 굳이 call를 이용하나요?
call을 이용하는 이유는 call를 실행하게 되면 호출된 해당 함수가 끝난 후에 다시 돌아오기 위해서 주소를 stack에 저장하게 됩니다.
이 스택에 저장한 값을 pop을 이용해 사용하는 것이죠.
13 : 스택에 있는 값을 pop하여 ecx에 저장합니다.
※ 출력하는 함수인 write()는 ecx 레지스터에 문자열 포인터가 들어갑니다.
따라서, ecx에 값을 저장하기 위해서 25줄에서 스택에 쌓았던 Hello World 문자열을 pop을 통하여 가져옵니다.
그 이후는 전과 같습니다.
objdump로 확인하기
0x00 값이 없는 것을 확인합니다.
objudmp로 쉘 코드 만들기
쉘 코드 테스트
정상적으로 Hello World가 출력된 것을 확인할 수 있습니다.
'High Level Technique > Shellcoding' 카테고리의 다른 글
execve shellcode (0) | 2016.03.13 |
---|---|
RIP 상대주소 이용하기 (0) | 2016.03.13 |
Hello World Shellcode (0) | 2016.03.13 |
Shellcoding (0) | 2016.03.13 |
Libc, Nasm (0) | 2016.03.11 |