Hacking/System Hacking

Shellcode (쉘코드) GDB 사용법

나노콛 2019. 9. 26. 23:53

쉘코드는 시스템의 명령을 실행할 수 있는 기계어 코드
쉘을 실행시키기 위한 기계어 코드이며
소프트웨어 취약점 이용을 위한 내용부에 사용이 됩니다.

exploit는
취약점을 찾아서 원하는 명령을 실행하는 공격입니다.

쉘코드 제작 방법은
C언어로 코딩을 하고 그것을 어셈블리어로 분석하여
어셈블리어와 1:1대응되는 기계어로 제작을 합니다.

 

간단한 출력 프로그램을 만들어보겠습니다.


write.c

 

컴파일 합니다.

strace - 시스템 콜 호출을 추적할 수 있는 프로그램

방금 만든 프로그램을 추적하면

strace ./write

 

알아보기 어려운 문자들로 나오지만
하단에 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은 길이라는 것을 알 수 있습니다.

이 정보를 가지고 

syswrite.c

 

gcc -o syswrite syswrite.c -static

 

-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

 

기본 값이 at&t 기준으로 되어 있는데 intel 방식으로 문법을 변경할 수 있습니다.

intel 방식으로 나오는 것을 확인할 수 있습니다.

 

breakpoint는 이처럼 설정할 수 있고 i b 명령어로 확인할 수 있습니다.

 

del 명령어로 앞의 Num 번호를 입력하면 해당 번호의 breakpoint가 삭제됩니다.

 

프로그램을 실행하면 breakpoint까지 진행됩니다.

 

c를 눌리면 다음 break까지 가는 것을 볼 수 있습니다.
break가 없다면 프로그램이 끝날 때까지 진행됩니다.

watch를 이용하면 해당 값이 변경되면 멈추며 값을 알려줍니다.

 

i r 명령어로 현재 레지스터의 값을 확인할 수 있습니다.

 

x(주소)/s(문자열) (주솟값)으로 해당 주소의 값을 확인할 수 있습니다.

 

'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