ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • /bin/sh 을 실행하는 Shellcode 를 만들어보자
    Wargame Site/BOF 2019. 6. 7. 22:57

     

     

     

    \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80

     

     

    매번 /bin/sh 를 작동시키는 Shellcode 를 사용했지만, 긁어오기만 했지 직접 이 코드를 분석한 적이 없었다.

    성격상... 파헤쳐봐야겠다.

    끄적끄적의 내용을 토대로 진행해보았다.

     

     

     

     

    1. execve( ) 

     

    /bin/sh 을 코드내에서 실행하기 위해서 어떻게 해야할까? 이 때 사용되는 것이 execve (  ) 이다.

     

    출처 : http://shell-storm.org/shellcode/files/syscalls.html

    또한, /usr/include/asm/unistd_32.h 에서도 확인할 수 있다.

    이제 'man execve' 를 통해 사용법을 알아보자.

     

     

     

    2. execve 사용해보기

     

    우선 위와 같이 c 언어 코드로 작성을 해보았다.

    이를 컴파일해서 실행한 결과 /bin/sh 가 정상적으로 작동한 것을 볼 수 있었다.

     

     

     

    3. shell 분석

    /bin/sh 를 저장할 때 Little Endian 방식으로 저장하는 것을 볼 수 있다. 또한, 3개의 인자가 잘들어가 있는 것을 확인할 수 있다.

     

    disas execve 를 통해 execve 의 코드를 볼 수 있었다.

    그렇다면 밑에 있는 call 은 systemcall 을 부르는 것이여야 할 것이다... 근데 gs:0x10.... 는 뭘까..

     

    googling 을 통해 int 0x80 과 gs:0x10 은 같은 의미를 가진다는 것을 알았다.

    깊이 학습하게 되면 꼭 다시 짚고 넘어가고 싶다.

     

     

     

    4. asm 코딩

     

    레지스터의 모양을 예상해보도록 하자.


    EAX : 11             EBX : "/bin/sh"          ECX : [ "/bin/sh", 0 ]           EDX : 0


     

    여.기.서.잠.깐

     

    다음과 같이 shellcraft.i386.pushstr(문자열) 을 통해서 문자열을 Push 하는 어셈블리어를 뽑아낼 수 있다.

    "/bin/sh" 라는 문자를 Push 하기 위한 명령어는 다음 push, xor, push 세 줄과 같다.

     

    test.asm

    여기서 주목할 점은 nasm 에서는 ptr 표기법을 사용하지 않는다는 점이다. 

    nasm 에서는 ptr 을 뺀 표기법을 사용한다. 만약 shellcraft 에서 나온대로

    dword ptr [esp] 의 형태로 작성했다면 해당 에러를 볼 수 있을 것이다.

     

     

    test.asm 사진대로 작성을 한 뒤, 해당 명령어를 사용하게 된다면

     

    그 뒤, 밑의 명령어를 입력하게 되면 test 실행 파일이 생기는 것을 알 수 있다.

    다음과 같이 Assembly 언어로 /bin/sh 을 실행 시킨 것을 볼 수 있다.

     

    OP code 를 따주면 Game SET  ~

     

     

     

     

    인터넷 검색을 하다가 grep 을 사용해서 쉘코드를 추출하는 명령어를 발견했다.

    출처 : https://medium.com/@chaudharyaditya/slae-0x1-linux-x86-bind-shellcode-e2d4d8cd46fd

     

     

    댓글

Designed by Tistory.