(학교 실습 때 푼 밤랩의 풀이를 정리하면서 개념을 다시얻고자 적어보기)
예시 밤랩은 아래의 사이트에 들어간 후 다운받기
밤랩은 카네기멜론 대학에 재직중인 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.
이런 약간의 재치있는 문구?는 전반적으로 교재에서 다루어지는 과제에 있어서 푸는데 약간 긴장이 풀어지는 부분들이 있었습니다. :)
그러면 거두절미하고, 풀이로 들어가보겠습니다.
디버깅할 파일이 있는 경로에 다음과 같은 명령어를 작성해줍니다.
gdb (디버깅할 파일 이름)
그러면 gdb로 파일을 디버깅할 수 있게 됩니다!
gdb을 실행해준 후, 다음의 명령어를 작성해주시면 됩니다.
disas (어셈블리어로 보고픈 함수명)
(주소 기준으로 disas를 할 수 있지만, 여기서는 생략하겠습니다.)
(사진에서는 main함수를 disassemble한 것입니다.)
그러면 이런식으로 어셈블리어로 볼게 있게 됩니다!
gdb을 실행된 상황에서 다음을 작성해주시면 됩니다.
b [함수명]
b *[함수명] + [함수에서 떨어진 정도]
b는 break point의 약자로, break로 작성하여도 동일한 동작을 수행합니다.
2번째 방법은 포인터를 이용하는 방식이므로 b *main + 32
와 같이 사용해주시면 됩니다.
만약 스코어보드가 있어 점수를 판정을 한다면, gdb를 실행 후 explode_bomb에 break point를 잡아놓는게 좋습니다. 폭탄이 터지면은 점수에 불이익이 있기 때문입니다.😟
또한 각각의 phase별로 break point를 걸어놓으면 문제를 풀때 보다 편하게 풀 수 있습니다.
p $[레지스터 이름]
x/[출력 횟수][출력 형식] [출력 단위][출력 위치]
여기서 출력 횟수는 아라비아 숫자를 작성해주면 됩니다.
출력 형식으로는 진수로 출력한건가, 문자로 출력할 건가를 정해주면 되는데 다음과 같은 것을 사용할 수 있습니다.
예시로 x/16xg main
은 main의 주소부터 [16개를 출력하는데], [16진수로 뽑고], [8바이트 단위로 나눠 찍는다]는 의미이다.
ni
q 혹은 quit