취약점분석/Pwnable

[Pwnable] 셸코드 바이트코드 추출

poiri3r 2025. 6. 19. 02:50

저번에 ORW 셸코드와 execve 셸코드를 작성하는 방법을 포스팅했었습니다.

오늘은 셸코드를 바이트 코드로 추출하는 방법과 pwntools 라이브러리에 포함된 shellcraft의 사용 방법에 대해 알아보겠습니다.

 

아래 사진은 저희가 저번에 작성했던 execve.asm 코드입니다.

위 어셈블리 코드의 목적은 단순히 현재 실행된 프로세스에서 /bin/sh를 실행시키는 것입니다.

저희가 셸코드를 공부하는 이유는 익스플로잇을 하기 위함이고, 익스플로잇을 하기 위해서는 해당 코드를 우리가 익스플로잇하고자 하는 서버에서 실행되게 해야 합니다.

해당 어셈블리 코드 조각만으론 익스플로잇이 불가능하고 공격이 불가능합니다. 따라서 위의 코드를 기계가 인식할 수 있는 바이트코드(opcode)형태로 추출해야 버퍼오버플로우 같은 공격 시 사용이 가능합니다. 

 

과정이 복잡하지 않으니 바로 진행해보겠습니다.

먼저 아래 과정은 검토용으로 꼭 필수 작업은 아닙니다. 

 

.o파일의 내용을 디스어셈블해서 보기 좋게 출력해보려면 objdump을 설치해야 합니다.

obj dump는 binutils 패키지에 포함되어있으므로 다음과 같은 명령어로 설치해줍니다.

apt install binutils

 

*obj가 기본 포함 되어있는 경우도 있습니다.

설치가 되어있으면 다음과 같은 명령어로 오브젝트 파일을 읽어줍니다.

objdump -d shellcode.o

 

다음 명령어는 오브젝트 파일(확장자 .o)의 내용을 디스어셈블 해서 사람이 보기 좋게 출력해줍니다.

저희가 짰던 어셈과 똑같이 잘 들어갔음을 확인할 수 있습니다 (73 68 00은 objdump가 1줄에 6바이트만 보여주기 때문에 자동 줄바꿈으로 아래 출력된 것입니다.)

 

이제 본격적으로 바이너리 추출을 시작하겠습니다. 

1. 순수 바이너리 추출

다음 명령어를 입력해줍니다.

objcopy -O binary execve execve.bin

 

해당 명령어는 execve라는 ELF 파일에서 순수한 바이너리 코드(모든 섹션을 제거)만을 추출해 execve.bin이라는 파일로 저장합니다.

해당 execve.bin을 hexdump로 보면 쉘코드를 확인할 수 있습니다.

파일에 다음과 같은 파일이 생겼고 HxD로 열어보겠습니다.

 

다음과 같이 짧은 헥스코드가 나오는데 위의 헥스 코드가 바이트 형태로 추출한 쉘코드입니다. 다음 쉘코드를 txt파일에 저장해보겠습니다.

 

2.추출 결과 저장

저희는 추출 결과를 \x48\x31 .. 형태로 저장해야 삽입 가능합니다.

hexdump -v -e '"\\x" 1/1 "%02x"' execve.bin > execve.txt

 

표준 명령어는 위와 같습니다. 하지만 wsl이나 윈도우 설정에 따라 \ -> \\로 이스케이프 되서 정상 출력되지 않는 경우가 있습니다

저도 다음과 같이 출력이 되어서 좀 곤란했는데 다른 명령어로 출력해줬습니다.

xxd -p execve.bin | tr -d '\n' | sed 's/../\\x&/g' > execve.txt

위 명령어는 execve.txt에 최종적인 쉘코드를 저장해줍니다.

최종적으로 잘 저장이 되었습니다! 해당 쉘코드는 복사해서 실제 익스플로잇 payload로 바로 사용 가능합니다.

\x48\x31\xc0\x48\xbf\x2f\x62\x69\x6e\x2f\x73\x68\x00\x57\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\xb0\x3b\x0f\x05

 

오늘 포스팅은 여기까지 하고 마치도록 하겠습니다.

시험기간이라 포스팅할 시간이 많이 없는데 틈틈히 쓰겠습니다.

다음 포스팅엔 셸코드 문제 풀이와 shellcraft에 대해 포스팅 하겠습니다. 감사합니다