16년도 시스템프로그래밍 bomblab(폭탄랩) 카네기멜론대학 lab시리즈
- 최초 등록일
- 2017.07.09
- 최종 저작일
- 2016.11
- 19페이지/ 한컴오피스
- 가격 5,000원
* 본 문서는 한글 2005 이상 버전에서 작성된 문서입니다.
한글 2002 이하 프로그램에서는 열어볼 수 없으니, 한글 뷰어프로그램(한글 2005 이상)을 설치하신 후 확인해주시기 바랍니다.
소개글
ㅊㄴㄷ 시스템프로그래밍 ㄱㅎㅅ 교수님 강의를 수강하며 작성한 레포트입니다.
16년도부터 각 랩의 문제들이 64비트 기반으로 변경된 것을 바탕으로 풀었습니다.
만점을 받은 레포트이며, 폭탄랩은 소스코드를 읽어서 답안을 작성제출해야 하므로
답안을 유도해낸 과정을 보고서에 작성하였으며 Flow Chart를 요구하여 상세히 그렸습니다.
phase_1 ~ phase_6 포함, 보너스 phase_7 또한 포함되어 있습니다.
목차
1. 개요
2. 각 단계에 대한 해결 방법
2.1 해결방법
2.2 Flow Chart(순서도)
2.3 정답
3. 고찰 및 느낀 점
4. 결과 화면
4.1 폭탄 해체 화면
4.2 웹 페이지 결과 화면
본문내용
1. 개요
07주차 실습은 폭탄랩(Boom lab)으로 이때까지 이론과 실습에서 배웠던 개념들을 적용하여 폭탄(Boom)이라는 파일을 해체하는 실습이다. 총 7단계의 Phase로 구성되어 있으며 그 중 6단계의 Phase는 기본적으로 주어져 있지만, 마지막 secret_phase는 개발자가 숨겨둔 스트링단어를 정답에 같이 입력함으로써 진입이 가능하다. 폭탄을 해체하는데 리눅스 환경에서는 vi, objdump, gdb등의 명령어를 사용하고, 주 작업은 gdb boom명령어를 통해 gdb환경에서 폭탄 해체작업을 한다. gdb에서는 레지스터에 저장된 값을 볼 수 있는 info registers 명령어, 메모리주소에 저장된 값을 볼 수 있는 x/[bit][type] [address] 명령어 등을 이용하여 폭탄해체에 필요한 정보를 얻어 정답을 유추한다.
폭탄 해체작업은 실시간으로 각자의 진행상황이 웹페이지에 등록된다.
2. 각 단계에 대한 해결 방법
Phase_1
2.1 해결 방법
phase_1에서는 2번째 줄에서 esi레지스터에 $0x402670번지에 저장되어 있는 값을 복사하고 strings_not_equal메소드를 호출한다. 그리고 함수호출로 반환된 값 eax를 test %eax, %eax를 이용하여 ZF=1이면 스택의 크기를 증가시키고 프로그램을 종료하고, ZF=0이면 폭탄이 터지게 된다. 이 때 ZF=1이라는 것은 eax에 저장된 값이 0이어야 하고 eax가 0이려면 strings_not_equal에서 비교하는 두 스트링이 같아야 한다. 그래서 처음에 esi레지스터에 저장하였던 값을 확인하기 위해 gdb에서 x/s $0x402670를 사용해보니 "Brownie, you are doing a heck of a job."이라는 스트링 값이 저장되있음을 알 수 있었다. 그리고 gdb에서 b strings_not_equal으로 브레이크포인트를 설정하고 info register명령어를 통해 레지스터에 저장되는 값을 확인해보니 사용자로부터 입력받는 값은 rdi레지스터에 저장되고, $0x402670에 저장된 값은 esi레지스터에 저장되는 것 확인하였다.
참고 자료
없음