-
/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 세 줄과 같다.
여기서 주목할 점은 nasm 에서는 ptr 표기법을 사용하지 않는다는 점이다.
nasm 에서는 ptr 을 뺀 표기법을 사용한다. 만약 shellcraft 에서 나온대로
dword ptr [esp] 의 형태로 작성했다면 해당 에러를 볼 수 있을 것이다.
test.asm 사진대로 작성을 한 뒤, 해당 명령어를 사용하게 된다면
그 뒤, 밑의 명령어를 입력하게 되면 test 실행 파일이 생기는 것을 알 수 있다.
다음과 같이 Assembly 언어로 /bin/sh 을 실행 시킨 것을 볼 수 있다.
OP code 를 따주면 Game SET ~
인터넷 검색을 하다가 grep 을 사용해서 쉘코드를 추출하는 명령어를 발견했다.
'Wargame Site > BOF' 카테고리의 다른 글
|Lord Of Bufferoverflow| #11 skeleton - golem (0) 2019.06.16 |Lord Of Bufferoverflow| #10 vampire - skeleton (0) 2019.06.10 |Lord Of Bufferoverflow| #9 troll - vampire (0) 2019.05.20 |Lord Of Bufferoverflow| #8 orge - troll (0) 2019.05.20 |Lord Of Bufferoverflow| #7 darkelf - orge (0) 2019.05.20 댓글