1 / 17

Bomb 제거

Bomb 제거. System Programming. System Software Lab. 목차. 개요 실행방법 Bomb 수령 Bomb 제거 서버 접속 방법 평가 과제 TIP GDB 사용방법. 개요.

yaakov
Download Presentation

Bomb 제거

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Bomb 제거 System Programming System Software Lab

  2. 목차 • 개요 • 실행방법 • Bomb 수령 • Bomb 제거 • 서버 접속 방법 • 평가 • 과제 TIP • GDB 사용방법

  3. 개요 • 본 과제의 목적은 gdb를 사용하여 binary code를 reverse engineering하고 주어진 binary code의 수행 내용을 이해하는 것이다. 본 과제는 Dr. Evil이 만든 폭탄을 제거하는 시나리오를 갖고 있다. 폭탄을 실행시키면 특정 입력을 기다리게 되어 있으며, 정확한 입력을 주면 폭탄이 제거되고 다음 단계로 넘어간다. 잘못된 입력을 주면 폭탄은 "BOMB!!!"이라는 메시지와 함께 터진다.

  4. Bomb 수령 • http://203.252.182.141:15213에 접속하여 폭탄을 다운로드 받는다. 이 때 자신의 이메일 주소와 학번을 정확히 기입한다. • 폭탄은 단 한번만 수령하며, 여러 번 수령하지 않을 것을 꼭 주의한다. • 각자 수령한 폭탄은 bomb#.tar 파일로 되어 있는데, 이때 #은 각자에게 부여된 고유 번호이다. • 이 폭탄 파일을 203.252.182.141의 각자 디렉토리에 ftp를 사용하여 저장하고 tar -xvf bomb#.tar 명령어를 수행하여 압축을 푼다 (서버에 각자의 아이디와 비밀번호는 학번과 같다). • 압축해제된 파일은 다음과 같이 구성된다 • README: 폭탄의 식별자와 소유자 정보 • bomb: 실행 가능한 binary 폭탄 • bomb.c: bomb의 메인 루트 소스파일

  5. Bomb 제거 • 폭탄제거는 반드시 203.252.182.141에 로그인 하여 수행한다. 다른 서버에서수행해도 점수가 반영되지 않는다. • 폭탄 제거를 위한 여러 가지 방법을 사용할 수 있으나 다음의 도구들의 기능을 사용할 것을 추천한다. • gdb의 브레이크 포인트, disassemle, 그리고 그 외 명령어 • objdump -t (출력되는 symbol table에서 함수, 전역변수, 그리고 이들의 주소를 알 수 있음) • objdump -d (assembly code 생성) • strings (프린트할 수 있는 문자열들을 출력) • 제거한 폭탄의 입력을 매번 타이핑하기 번거로우면 psol.txt에 폭탄 제거 입력을 넣고 ./bomb psol.txt와 같이 수행시키면 EOF를 만날 때까지 읽고 다음 단계의 폭탄 단계로 수행된다. • 꼭 psol.txt 파일명이 아닌 다른 파일명을 사용할 수 있다.

  6. 서버접속 • 본인의 컴퓨터에서 Putty나 윈도우 터미널 같은 터미널 프로그램을 이용하여 접속한다. • 주소 : 203.252.182.141 • 계정 : id - 본인학번 / pw – 본인학번 • SSH 로 접속 (Telnet 은 접속불가) • FTP는 보통의 ftp 를 사용하여 사용할 수 있다. • FTP는 보통의 명령어를 사용한다. • FTP 계정은 서버 계정과 일치한다. • FTP 사용시 본인의 폴더 이외는 이동이 불가능하다. • Root 계정은 사용 불가능.

  7. 평가 • 폭탄이 터질 때마다 그것은 기록되고 1/4점씩 감점된다. • 총 6단계의 폭탄이 있으며 각 단계는 10점씩 할당된다. • 동료들의 진행상황을 http://203.252.182.141/~bomb에서 확인할 수 있다. • 6단계가 끝인지 확인해 보는 것도 재미있을 것이다. • 기한이 지나면 폭탄제거 서버는 그 기능을 멈출 것이다.

  8. 과제 TIP • Bomb 은 여러 개의 phase로 구성되어 있다. • 각 phase는 다른 방식으로 프로그램되어있다. • Phase1 – 문자열 매칭 • Phase2 - 배열 • Phase3 - 스위치 • Phase4 – 함수 콜 • Phase5 – 배열 • 이후의 Phase는 각자 알아보기 바람. • 각 phase 의 구성에 따라 어셈코드가 틀려지니 힌트로 삼기 바람

  9. 과제 TIP • 각각의 학생마다 받은 파일이 틀림 • 각 phase마다 breakpoint를 걸어서 진행하는 것이 요령

  10. Gdb 사용법 • 간단한 명령어들을 첨부하니 과제에 도움이 되길 바랍니다. • 대상프로그램 지정 • gdb 파일이름 • run - 대상 프로그램을 시작 시킨다.ex)run : 대상 프로그램을 시작 시킨다.run 인자 - 대상 프로그램의 인자값을 준 상태로 시작 시킨다.ex)run 1234 : 인자로써 1234를 주고 시작 시킨다.kill - 대상 프로그램을 종료 시킨다.ex)kill : 대상 프로그램을 종료 시킨다. • Break Point(중단점) 관리 • Break지정한 주소에 Break Point를 걸 수 있는 명령입니다.다음과 같이 사용할 수 있습니다.break 함수 - 지정한 함수에 BP를 설치 합니다.ex)break main : main()함수에 BP를 설치한다.break 주소 - 지정한 주소에 BP를 설치 합니다.ex)break 0x08048454 - 0x08048454에 BP를 설치한다.break - 인자 없는 break는 실행중인 현재 주소에 BP를 설치합니다.ex)break - 현재 실행중인 주소에 BP를 설치한다.

  11. Gdb 사용법 • Clear, Delete • 지정한 BP를 제거하거나, 모든 BP를 제거 할때 사용합니다.두 명령어의 사용방법은 전혀 다른데,다음과 같이 사용할 수 있습니다.clear 함수 - 지정한 함수에 설치되어 있는 BP 제거ex)clear main : main()함수에 설치된 BP 제거delete BP번호 - 지정한 BP번호의 BP를 제거ex)delete 1 : 1번 BP에 대한 BP제거delete - 모든 BP를 제거ex)delete - 모든 BP제거 • Condition • 특정 BP에 조건을 부여할 수 있습니다.다음과 같이 사용할 수 있습니다.condition 번호 조건 - 지정한 번호에 대한 BP에 조건을 부여합니다.ex) condition 1 $eax==5 : 1번 BP는 eax의 값이 5일때만 멈춘다.ex) condition 1 $eax < 3 : 1번 BP는 eax의 값이 3미만일때만 멈춘다ex) condition 1 ($eax < 3) && ($ecx > 5) : eax의 값이 3미만이고,      ecx의 값이 5 초과 일때만 멈춘다.ex) condition 1 ($eax < 3) || ($ecx > 5) : eax의 값이 3미만이거나,      ecx의 값이 5촉ex) condition 1 $eax=5 : 1번 BP가 작동할떄 eax의 값을 5로 만든다.위의 예 말고도 원하는 특정한 조건일 때 멈추게 할수도 있거니와,해당 BreakPoint에 걸렸을때 원하는 값으로 Set 시키는 용도로 사용할 수 있는 것입니다.

  12. Gdb 사용법-Debugging중 상태 보기 • Info • gdb로 디버깅 중, 현재 Register들의 상태라던지, 설치되어 있는 BreakPoint들의 상태가 궁금할 수 있습니다.이럴떄 사용하는 명령어가 바로 info 입니다. 다음과 같이 사용할 수 있습니다.info reg - 모든 레지스터들의 정보 출력ex) info reg : 모든 레지스터들의 정보 출력info reg 특정레지스터 - 특정레지스터의 정보 출력ex) info reg eax - eax의 정보 출력ex) info reg eax ebx - eax,ebx의 정보 출력info breakpoints - 모든 BreakPoint들의 정보 출력ex) info breakpoints - 모든 BreakPoint들의 정보 출력info breakpoints BP번호 - 특정한 BP번호에 대한 정보 출력ex) info breakpoints 1 - 1번 BP에 대한 정보 출력info args - 프로세스가 시작될때 주어진 인자값 출력ex) info argsinfo func - 프로세스가 사용하는 함수들에 대한 출력ex) info funcinfo frame - 프로세스 프레임에 대한 정보 출력ex)info frameinfo display - 중단될 떄 마다 출력될 display들에 대한 출력ex) info display • Display • 중단될 떄 마다 특정한 값을 출력하고 싶다면, display 명령을 사용하면 됩니다.다음과 같이 사용할 수 있습니다.display $레지스터 - 특정 레지스터 값을 중단될 떄 마다 출력ex)display $eax : eax의 값을 중단될 떄 마다 출력

  13. Gdb 사용법-Debugging중 상태 보기 • Watch • info와 특정한 레지스터의 값이 변경되었을 떄나,변수의 값이 변경되었을 떄에 그 변경됨을 알고 싶다면,watch 명령어를 사용할 수 있습니다.다음과 같이 사용할 수 있습니다.watch $레지스터 - 특정 레지스터의 값이 변경될 떄.ex)watch $eax : $eax의 값이 변경될 떄 마다 알림watch $주소 - 특정 주소의 값이 변경될 떄ex)watch $804981c : 0x804981c의 값이 변경될때 알림*watch는 BP와 마찬가지로 info watchpoints를 통해서 목록을 볼 수 있고, break관리에 쓰던 명령들을 쓸 수 있음. • Printf • printf는 c언어를 해보신 분이라면 다 아는 함수죠.지정한 형식에 따라 값을 출력해 줍니다.다음과 같이 사용할 수 있습니다.printf [“포맷스트링”, 인자1, 인자2, 인자3, ..., 인자n]ex) printf "%x",$eax :eax 레지스터의 값을 16진수로 표시

  14. Gdb 사용법-Debugging중 상태 보기 • x/포맷문자 (유용함) • 메모리에 있는 값을 출력해야 할 떄가 있습니다.그떄 사용하는 것이, x/ 입니다.다음과 같이 사용할 수 있습니다.x/x 주소 - 특정한 주소의 값을 16진수로 출력ex) x/x 0x8048454 : 0x8048454의 값을 16진수로 출력x/s 주소 - 특정한 주소의 값을 문자열로 출력ex) x/s 0x8048454 : 0x8048454의 값을 문자열로 출력x/50x 주소 - 특정한 주소부터 50개 만큼 16진수로 출력ex) x/50x 0x8048454 : 0x8048454부터 50개만큼 출력x/c 주소 - 특정한 주소의 값을 문자값으로 출력ex) x/c 0x8048454 : 0x8048454에 있는 값을 문자로 출력 • Disas • 특정한 주소의 코드가 보고 싶을 떄 사용하는 명령어 입니다.다음과 같이 사용할 수 있습니다.disas - 가장 처음 부터 Disassemble한다.ex) disasdisas 함수 - 특정한 함수만 Disassemble 한다.ex) disas maindisas 시작주소 끝주소 - 시작주소 부터 끝주소 까지 Disassembleex) disas 0x804845c 0x804849dex) disas main main+5

  15. Gdb사용법 - Debugging 진행 • Nexti • Debugging을 할떄에 step by step을 하며 한줄씩 실행 시켜야할떄가 있습니다. 그럴 떄 사용하는 명령어가 nexti입니다.다음과 같이 사용할 수 있습니다.nexti - 다음 명령어 까지 실행ex)nexti : 다음 명령어 까지 실행nexti 갯수 - 갯수 만큼의 명령어 실행ex)nexti 5 : 5개의 명령어 실행 • Cont • Debugging을 할때에 다음 BP까지의 명령들은 step by step을건너 뛰고 싶을때 사용하는 명령어 입니다.다음과 같이 사용할 수 있습니다.cont - 다음 BP를 만날 떄까지 실행ex)cont - 다음 BP를 만날 떄까지 실행

  16. Gdb사용법-그외 명령어 • set - 특정한 값으로 변경 시킬때 사용합니다.ex) set $eax=3 : eax의 값을 3으로 만듭니다.quit - gdb를 종료합니다.bt - 콜 스택을 보여줍니다.cd - 작업 폴더 변경pwd - 현재 폴더 출력help - 도움말 정보를 출력합니다

  17. Q & A • 새천년관 1106호 • antistar7@gmail.com • 수업게시판 • http://sslab.konkuk.ac.kr • 과제 마감일 당일 서버에 접속이 많아질 수 있으므로 미리 과제를진행하기 바랍니다.

More Related