System Programming - BombLab (intro, Phase 1) 풀이

ensalada.de.pollo·2024년 9월 6일
0

BombLab

목록 보기
1/3

Intro

풀이에 앞서 Bomb lab에 대한 설명을 드리겠습니다.

bomb lab은 역어셈블러를 통해 어셈블리어 코드를 살펴보고, 어셈블리어 코드를 통해 폭탄을 해제할 수 있는 입력 값을 넣어 문제를 풀어나가는 과제입니다. 만약, 입력 값이 틀린다면 폭탄이 터지게 됩니다.

위 같은 특징으로, 리버스 엔지니어링을 공부하실때 도움이 될 것 같네요.

실습 과제로 주어졌을 때에는 boom 횟수가 반영됩니다. 터질 때마다 마음이 아프니, 미리 연습을 하고 과제를 하시는 것을 추천드립니다. (bomb lab의 문제는 다양하지만, 각 페이즈 별 풀이의 접근법이 비슷합니다. 이 글이 도움이 되었으면 좋겠습니다.)


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


위 링크는 cmu에 올라온 다양한 과제 문제들입니다. bomb lab 외에 다른 과제들도 많으니 참고해보시길 바랍니다.

실습은 gdb로 진행됩니다.

Phase 1

phase 1 입니다.

<+0>은 스택 포인트 조작에 해당합니다. 앞으로의 문제에서도 많이 등장할테니 phase_1에서만 언급하고 넘어가겠습니다.

<+4>에서 *rip + 0x1821의 값을 rsi 레지스터로 옮겨주고 있네요. 각주로 주소를 알려주고 있으니 나중에 값을 한 번 확인해봐야 할 것 같습니다.
(참고로 rsi 레지스터는 rdi 레지스터와 함께 함수의 인자로 많이 들어가는 레지스터입니다.)

<+11>에서 strings_not_equal이라는 함수를 호출하고 있습니다. si 명령어를 통해 한 번 내부로 진입해보겠습니다.

<+4>와 <+7>을 보면 rbx와 rbp에 rdi와 rsi가 각각 대입되고 있습니다.

<+10>과 <+21>에서는 string_length를 호출하고 있습니다. 문자열의 길이를 검사하는 함수라고 추측할 수 있습니다.

<+10>의 인자로 rdi가 들어갔고,

<+18>에서는 rsi의 값을 담은 rbp를 rdi에 대입하는 것을 보아

<+21>에서는 rsi의 값이 인자로 들어갔나 봅니다.

<+15>를 보니 eax가 string_length의 리턴 값으로 나오고 있고 이를 r12에 옮기네요.

그리고 <+31>에서는 <+21>의 리턴 값으로 나온 eax와 <+10>의 리턴 값을 저장한 r12를 비교합니다.

<+34>에서 eax와 r12가 같다면 <+43>으로 분기해서 본격적인 문자열 비교를 시작합니다.

설명이 좀 길었지만, rsi와 rdi가 서로의 비교 대상이 되나봅니다.

한 번 둘의 값을 살펴보겠습니다.

rdi 레지스터에는 임의로 넣었던 문자열이 들어있습니다.

rsi 레지스터에는 정답으로 추정되는 문자열이 들어있네요.

이 문자열을 다시 입력 값으로 넣어주면

"Phase 1 defused." 라는 폭탄 해제 알림문구를 볼 수 있습니다.

따라서 phase 1의 정답은 "I am the mayor. I can do anything I want."가 되겠네요.

0개의 댓글