본문 바로가기

드림핵

[드림핵 워게임]shell_basic

<문제>

 

<풀이>

먼저 다운로드한 파일 중에서 C코드를 열어보았다.

뭐하는 함수인지 이해하기 어려운 함수들이 있었는데 문제를 읽어보면 풀이와 관련이 없는 함수인 것을 알 수 있다.

main함수는 아래와 같이 매우 간결하게 생겼다.

46행에서 "shellcode: "를 출력하고 바로 read() 함수로 데이터를 읽어온다.

 

프로그램이 어떤 모습으로 돌아가는지 직접 확인하고 싶어서

shell_basic 실행파일을 실행해보았다.

실행하니 "shellcode: "가 출력되고 임의로 iguana를 입력하고 나니

segmentation fault가 뜨면서 프로그램이 종료되었다.

 

공격코드를 쉘코드로 제작해서 입력하면 해당 코드가 main 함수의 50행에서 실행되는 것으로 파악하였다.

드림핵 시스템해킹 로드맵의 Shellcode 스테이지에서 orx셸코드와 execve셸코드 두 가지 종류를 학습했는데

이 문제에서 어떤 셸코드를 써야할지 헷갈렸다.

 

처음에는 execve셸코드로 셸을 획득해서 

cat /home/shell_basic/flag_name_is_loooooong

으로 flag를 읽어오는 것인 줄 알았는데 해보니까 안 됐다.

 

알고보니 orw셸코드를 이용해서 /home/shell_basic/flag_name_is_loooooong 파일을 열고 읽고 출력하는 것이었다.

gedit exploit.asm으로 파일을 생성한 후

직접 해당 어셈블리 코드를 짜보았다.

로드맵을 참고해서 짰다.

 

문제 하단에 제공된 연습용 코드를 참고해서 asm 파일을 바이트코드인 exploit.bin으로 변환했다.

 

이제 이 바이트코드를 드림핵 문제 서버에 입력해야 한다.

로컬에는 /home/shell_basic/flag_name_is_loooooong 파일이 없기 때문에

원격으로 드림핵 서버에 접속해야 한다.

 

pwntools를 이용해서 드림핵 문제서버에 접속해서 셸코드를 전달한 후 결과값을 받아오는 익스플로잇 코드를 작성했다.

4행에 들어가는 드림핵 서버 정보는 문제 페이지에서 request VM을 통해 받을 수 있다.

이렇게 했는데 셸코드가 제대로 파일을 제대로 불러오지 못했다.

어셈블리코드를 수정해보고 다시 바이트코드로 변환하는 작업을 하면서 여러번 시도해봤는데 결국 안 돼서 인터넷에서 제공되는 셸코드를 가져왔다.

그랬더니 flag가 출력되었다.

 

 

 

 

 

[후기]

- 어셈블리코드는 이제 어느정도 짤 수 있겠는데 실제 환경에서 오류가 나지 않는 무결한 코드를 짜는 법은 더 학습이 필요하다.

- 바이트코드를 파이썬에 입력할 수 있는 형태로 변환하는 작업이 굉장히 불편하고 귀찮았는데 쉽게 변환할 수 있는 방법을 더 찾아봐야겠다.

- 아직도 특정 문자열을 little endian 방식으로 변환하는 것이 헷갈린다. 반복경험이 필요하다.