BombLab

beans_I·2024년 2월 13일
0

(학교 실습 때 푼 밤랩의 풀이를 정리하면서 개념을 다시얻고자 적어보기)

예시 밤랩은 아래의 사이트에 들어간 후 다운받기

http://csapp.cs.cmu.edu/3e/labs.html

BOMB LAB 💣

밤랩은 카네기멜론 대학에 재직중인 Randal E. Bryant 교수가 작성한 컴퓨터 구조 책에서 다루어 지는 과제입니다.

밤랩의 컨셉은 Dr.Evil이 만든 실행가능한 폭탄 파일에서 단서를 찾아, 6단계를 걸쳐 폭탄 해체를 진행합니다. 여기서 각 단계마다 알맞는 텍스트를 작성하는데, 잘못된 텍스트라면 폭탄이 터져 실패하게 됩니다.

여담으로, 주어지는 C파일 보면 소소하게 유머러스한 문구들이 있습니다.

 * 예시로, 이런 거..?
 * Dr. Evil's Insidious Bomb, Version 1.1
 * Copyright 2011, Dr. Evil Incorporated. All rights reserved.
 *
 * LICENSE:
 *
 * Dr. Evil Incorporated (the PERPETRATOR) hereby grants you (the
 * VICTIM) explicit permission to use this bomb (the BOMB).  This is a
 * time limited license, which expires on the death of the VICTIM.
 * The PERPETRATOR takes no responsibility for damage, frustration,
 * insanity, bug-eyes, carpal-tunnel syndrome, loss of sleep, or other
 * harm to the VICTIM.  Unless the PERPETRATOR wants to take credit,
 * that is.  The VICTIM may not distribute this bomb source code to
 * any enemies of the PERPETRATOR.  No VICTIM may debug,
 * reverse-engineer, run "strings" on, decompile, decrypt, or use any
 * other technique to gain knowledge of and defuse the BOMB.  BOMB
 * proof clothing may not be worn when handling this program.  The
 * PERPETRATOR will not apologize for the PERPETRATOR's poor sense of
 * humor.  This license is null and void where the BOMB is prohibited
 * by law.

이런 약간의 재치있는 문구?는 전반적으로 교재에서 다루어지는 과제에 있어서 푸는데 약간 긴장이 풀어지는 부분들이 있었습니다. :)

그러면 거두절미하고, 풀이로 들어가보겠습니다.

시작하기 전 😶

1. GDB 📊

> GDB 실행

디버깅할 파일이 있는 경로에 다음과 같은 명령어를 작성해줍니다.

gdb (디버깅할 파일 이름)

그러면 gdb로 파일을 디버깅할 수 있게 됩니다!

> 어셈블리어 보기 🤖

gdb을 실행해준 후, 다음의 명령어를 작성해주시면 됩니다.

disas (어셈블리어로 보고픈 함수명)

(주소 기준으로 disas를 할 수 있지만, 여기서는 생략하겠습니다.)


(사진에서는 main함수를 disassemble한 것입니다.)
그러면 이런식으로 어셈블리어로 볼게 있게 됩니다!

> Break Point 잡기 ⏸️

gdb을 실행된 상황에서 다음을 작성해주시면 됩니다.

b [함수명]
b *[함수명] + [함수에서 떨어진 정도]

b는 break point의 약자로, break로 작성하여도 동일한 동작을 수행합니다.
2번째 방법은 포인터를 이용하는 방식이므로 b *main + 32와 같이 사용해주시면 됩니다.

약간의 팁) 📘

만약 스코어보드가 있어 점수를 판정을 한다면, gdb를 실행 후 explode_bomb에 break point를 잡아놓는게 좋습니다. 폭탄이 터지면은 점수에 불이익이 있기 때문입니다.😟
또한 각각의 phase별로 break point를 걸어놓으면 문제를 풀때 보다 편하게 풀 수 있습니다.

> 레지스터 값 확인

p $[레지스터 이름]

> 메모리 상태 검사

x/[출력 횟수][출력 형식] [출력 단위][출력 위치]

여기서 출력 횟수는 아라비아 숫자를 작성해주면 됩니다.
출력 형식으로는 진수로 출력한건가, 문자로 출력할 건가를 정해주면 되는데 다음과 같은 것을 사용할 수 있습니다.

1) 출력 형식

  • t : 2진수
  • o : 8진수 (octal)
  • d : int
  • u : unsigned int
  • x : 16진수
  • c : char
  • f : float
  • s : 문자열

2) 출력 단위

  • b : 1 바이트 단위 (byte)
  • h : 2 바이트 단위 (half word)
  • w : 4 바이트 단위 (word)
  • g : 8 바이트 단위 (giant word)

예시로 x/16xg main은 main의 주소부터 [16개를 출력하는데], [16진수로 뽑고], [8바이트 단위로 나눠 찍는다]는 의미이다.

> 다음 instruction 실행

ni

> gdb 종료

q 혹은 quit

profile
노션으로 옮겼습니다. https://beans-i.notion.site/main?pvs=74

0개의 댓글