<문제>
<풀이>
먼저 다운로드한 파일 중에서 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 방식으로 변환하는 것이 헷갈린다. 반복경험이 필요하다.
'드림핵' 카테고리의 다른 글
[드림핵]카나리 동적 분석 (1) | 2024.05.20 |
---|---|
[드림핵 System Hacking Fundamental] Stage 5 (0) | 2024.04.07 |
[드림핵 System Hacking Fundamental] Stage3 (0) | 2024.04.07 |
[드림핵 System Hacking Fundamental] Stage 1,2 (1) | 2024.04.07 |
[드림핵 워게임] basic_exploitation_001 (0) | 2024.03.31 |