25바이트 쉘코드를 작성해봤다.
해킹/개념 정리 2016. 1. 16. 12:27
위 글에서 쉘코드 작성법에 대해서 다뤘었는데 개념은 어느정도 가지고 갔지만 평소 내가 쓰던 25바이트 쉘코드에 비해 2바이트가 더 긴 27바이트 쉘코드가 완성됐었다.
공간효율은 높을수록 좋으므로 2바이트 더 작은 쉘코드를 작성하는 방법에 대해서도 공부해서 올려본다.
작성법에 대한 자세한 설명은 위 포스팅에서 했으므로 그냥 더 효율적인 방법을 소개한다는 생각으로 코드만 간단히 해설한다.
발상이 좀 특이한데 /bin/sh 은 총 7바이트로 이것을 스텍에 push하고 사용하려 하면 0x00이 중간에 들어갈 수밖에 없다.
그런데 이게 /bin//sh 이런식으로도 실행이 되는 모양이다.
실제로 해보니 정말로 /가 아무리 중첩해서 들어가도 프로그램을 실행하는데에는 지장이 없다.
자 그럼 /bin//sh 이렇게 8바이트를 만들어줘서 0x00가 들어가지 않도록 해줄 수 있다.
그래서 이런 코드를 짤 수 있다.
지난번과 다르게 문자열을 가장 밑에 둘 필요가 없으니 점프하고 콜하는 불필요한 부분이 사라졌다.
코드를 간단하게만 설명하면 먼저 eax를 xor해서 0으로 만든 뒤 스텍에 push한다. - 문자열의 끝을 알리기 위한 널이다.
그리고 차례로 //sh, /bin을 스텍에 push해준다.
그리고 이 문자열의 주소를 가르키고 있는 esp를 %ebx에 넣어준 후
다시 eax와 ebx를 push 해준다. eax는 배열의 끝을 알리는 널, ebx는 아까 문자열을 가르키는 포인터다.
그리고 이 ebx가 있는 스텍의 부분을 가르키는 esp를 ecx에 넣어주면 중요한 부분은 끝이다.
나머지는 특별할것 없는 인자전달 부분이다.
스텍 그림을 그려보면
||$ebx||0x00||/bin//sh||0x00||
^ ^
ecx ebx
이런식으로 ecx에 더블포인터가 들어가는 문제까지 해결됐다.
최종적인 바이너리 쉘코드는 위의 코드를 쭉 이으면 된다.
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\x31\xd2\xcd\x80
'해킹 > 개념 정리' 카테고리의 다른 글
'|'(파이프)를 사용한 페이로드 작성 (0) | 2016.01.21 |
---|---|
간단한 ASLR 우회/차단 기법 (0) | 2016.01.16 |
쉘코드 작성법 (0) | 2016.01.16 |
ASLR의 개념 (0) | 2016.01.13 |
함수의 프롤로그와 에필로그에 관한 고찰 + fake ebp(실패) (0) | 2016.01.13 |