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


Tags
Social