여기서 system("/bin/sh")로 해결하지 않은 이유는 , printf 함수와 마찬가지로 system함수 또한 execve함수를 내부적으로 수행하기 때문에 execve() 를 이용하여 쉘코드를 작성하였다.
-static 옵션을 통하여 execve함수 내부까지 어셈블리어를 더 자세히 볼 수 있다.
gdb를 통하여 main 부분을 확인하면 아래와 같다.
| 0x804840c | eax | 0x0 | dummy(4) | 0x804840c | 0x0 | sfp | ret |
다음 execve 함수 부분을 disassemble 해보자.
핵심 부분을 정리하면 아래와 같이 정리가 가능하다.
edi = 0x804840c
ecx = [ebp-8] 주소
edx = 0x0
ebx = edi = 0x804840c
eax = 0xb
참조하여 쉘코드를 작성
컴파일은 아래와 같은 과정으로 진행하면 된다.
as -o execve1.obj execve.s // 어셈블리파일 obj 파일 생성
gcc -o execve1 execve1.obj //obj파일을 실행파일로 만듬
./execve1 //실행
objdump를 사용하여 dump한다(-d옵션)
그럼 아래와 같은 메인 부분을 확인 할 수 있다.
shellcode : \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x62\x89\xe3\x50\x53\x89\xe1
\x89\xc2\xb0\x0b\xcd\x80
댓글 없음:
댓글 쓰기