서버에 접속했을때
readme를 먼저 읽어본다.
readme를 보면 asm파일이 asm_pwn권한으로 9026포트에서 돌아가고있다고한다. nc 0 9026에 연결해서 플래그를 얻을 수 있다.
플래그는 플래그파일의 이름은 여기 디렉토리에 있는 이름과 같다.
문제소스를 보자.
메인을 보면 출력해주는 문장들이 있다. shellcode를 만들 때 open(), read(), write() syscall 만을 사용해서 만들라고한다.
sandbox 함수를 실행시키는 밑부분을 보면 sh를 실행시키는 것을 알 수 있다.
sh는 처음에 0x90 * 0x1000 으로 초기화 시키고 stub 를 포함시키며, read함수를 통해 sh에 원하는 데이터를 1000byte만큼 입력할 수 있다.
sh에 포함되는 stub[] 가 뭔지 알아내자.
해당 기계어코드를 디스어셈블 한다.
모든 레지스터들을 0으로 초기화 시키는 것이다. syscall하기가 편해졌다.
chroot는 '프로세스 고립' 이라고 보면 된다. 주석을 보면 symlink 를 사용하지 못하게 하기위해 사용했다고 적혀있다.
Seccomp란 secure computing mode의 약자이다. Scmp_act_allow를 통해 syscall 가능한 함수들의 화이트 리스트를 뽑아주는 함수이다.
소스를 보면 open, read, write, exit, exit_group가 syscall 가능하다.
위 문제를 푸는 방법은 open을 통해 플래그 파일의 fd를 받아오고, read를 통해 flag파일의 데이터를 rsp에 저장, write함수를 호출하여
rsp에 저장된 데이터를 출력하게 만들어야한다.
쉘코드를 만드는 소스이다.
아키텍쳐를 arch 에 넣어주고 os도 설정해준다.
아키텍쳐나 os의 정보는 uname -a 명령을 통해서 확인 가능하다.
shellcraft함수를 통해 open,read,write 함수의 인자들을 설정해주어 기계를 출력할 수 있다.
open에 fd를 받아와야하는 파일의 이름을 넣어주고, read함수에 해당 fd가 저장되어있는 rax와 저장할 주소인 rsp, 그리고 사이즈를 넣어준다.
이후 write를 통해서 fd를 1로 설정하고 flag데이터가 저장되어있는 rsp와 size 100을 인자로 넣어주어 flag가 출력되게 해준다.
해당 쉘코드를 기계어 형태로 출력하면 문자들이 깨지기때문에 hexencode를 통해 출력해주고
페이로드 삽입시 hexdecode를 해준다.
flag가 출력된다. 이후 readme에 나와있는 포트주소에 데이터를 보내어 실제 flag를 받아온다.
쉘크래프트 좋다.
'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글
fsb (0) | 2018.12.21 |
---|---|
brainfuck (0) | 2018.12.21 |
passcode (0) | 2018.12.21 |
horcruxes (0) | 2018.12.21 |
cmd1 (0) | 2018.12.21 |