쉘코드는 시스템의 명령을 실행할 수 있는 기계어 코드
쉘을 실행시키기 위한 기계어 코드이며
소프트웨어 취약점 이용을 위한 내용부에 사용이 됩니다.
exploit는
취약점을 찾아서 원하는 명령을 실행하는 공격입니다.
쉘코드 제작 방법은
C언어로 코딩을 하고 그것을 어셈블리어로 분석하여
어셈블리어와 1:1대응되는 기계어로 제작을 합니다.
간단한 출력 프로그램을 만들어보겠습니다.
컴파일 합니다.
strace - 시스템 콜 호출을 추적할 수 있는 프로그램
방금 만든 프로그램을 추적하면
알아보기 어려운 문자들로 나오지만
하단에 printf()와 매치되는 부분이 보입니다.
write(1, "hacker\n",7)
이 부분이 출력을 C언어로 만들었던 출력을 위한 부분이라고 볼 수 있습니다.
write는 리눅스 system call 함수 중에 하나입니다.
write 명령어를 man으로 확인해 보겠습니다.
man 2 write 하면 되는데 여기에서 2는 섹션 번호입니다.
1부터 9까지 있으며
1: 시스템 명령어
2: 시스템 콜
3: 라이브러리 함수
fd = 파일 서술자
0: 표준 입력
1: 표준 출력
2: 표준 에러
*buf = 문자열 포인터
count = 길이
write(1, "hacker\n",7) 여기서
1은 표준 출력
"hacker\n"은 문자열
7은 길이라는 것을 알 수 있습니다.
이 정보를 가지고
-static 옵션은 정적 컴파일 옵션인데
정적 컴파일을 하면 함수를 찾아서 들어가지 않고
함수가 모두 올라가기 때문에 파일 용량은 커질 수 있으나 분석에 용이합니다.
GDB 분석
GDB는 디버깅 프로그램입니다.
[사용방법]
명령어
gdb [프로그램] - 프로그램 gdb로 열기
set disassembly-flavor [intel]or[att](축약형 set dis [intel]or[att]) - 어셈블리어 문법 선택
disassembly [함수]or[주소] - 디스 어셈블리 출력
break [offset]or[주소] (축약형 b)(offset으로 할 경우 앞에 * 붙어야 함) - breakpoint 설정
info breakpoints (축약형 i b) - breakpoint 목록 보기
del [번호]or공백 - breakpoint 삭제 (공백일 경우 모두 삭제)
run (축약형 r) - 프로그램 실행
info register (축약형 i r) - 레지스터 정보 보기
continue (축약형 c) - 다음 break 지점까지 프로그램 실행
si - step into
ni - step over
watch [변수명] - 값이 바뀔 때마다 break 설정 (모니터링)
[p or x]/[개수][출력형식] - 변수 및 주소 값 출력
p는 변수, x는 주소 출력 형식:x 16진수, s 문자열, d 10진수, b byte, i instruction
set $[레지스터] or [*주소] - 주소 및 레지스터 값 변경
gdb
실행시 위의 설명이 나오지 않게 하려면
gdb -q 옵션을 쓰면 됩니다.
기본 값이 at&t 기준으로 되어 있는데 intel 방식으로 문법을 변경할 수 있습니다.
c를 눌리면 다음 break까지 가는 것을 볼 수 있습니다.
break가 없다면 프로그램이 끝날 때까지 진행됩니다.
'Hacking > System Hacking' 카테고리의 다른 글
쉘 코드 제작 2 (Shellcode) (0) | 2019.09.27 |
---|---|
쉘코드 제작(shellcode) (0) | 2019.09.27 |
Backdoor - Netbus (트로이목마) (2) | 2019.09.26 |
Backdoor - NetCat (리버스 텔넷) (0) | 2019.09.26 |
Backdoor - NetCat(Portbind) (0) | 2019.09.26 |