본문 바로가기

관리하지않음/대학과제

bomb lab phase 2 설명

이전 포스팅 ☛ bomb lab phase 1 설명

간단히 푼 bomb lab phase 1에 비해서 phase 2는 굉장히 까다로웠습니다.

 

먼저 disas 명령어로 phase_2를 디스어셈블 해줍니다.

디스어셈블 한 코드

read_six_numbers를 통해서 6개의 숫자가 필요하구나를 대충 유추할 수 있습니다.

 

0x0000000000400ec7 <+30>: cmpl   $0x0,(%rsp)

rsp의 값과 0의 값을 비교해서 같지 않으면 exploed_bomb으로 보내버립니다.

여기서 첫번째 숫자는 0임을 알 수 있습니다.

 

0x0000000000400ecd <+36>: cmpl   $0x1,0x4(%rsp)

int형은 4바이트라고 하면 0x4(%rsp)가 의미하는 것은 두번째 인자라고 유추할 수 있습니다.

위 코드를 보고 두번째 인자는 1임을 알 수 있습니다.

 

0x0000000000400ee1 <+56>: mov    0x4(%rbx),%eax
0x0000000000400ee4 <+59>: add    (%rbx),%eax
0x0000000000400ee6 <+61>: cmp    %eax,0x8(%rbx) 

두번째 인자(0x4(%rbx))를 eax에 저장하고 eax에 첫번째인자(%rbx)를 더한 뒤,

eax와 세번째 인자를 비교합니다.

eax는 eax = 0x4(%rbx) + %rbx이기 때문에 0+ 1 = 1입니다.

이를 통해 세번째 숫자는 1임을 알 수 있습니다.

 

phase 2는 어떤 수열을 따르는 6개의 숫자를 입력해야 하는 문제입니다.

 

어셈블리어에 익숙하지 않아서 그 뒤의 코드는 잘 모르겠지만,

대충 앞의 두 수를 더한게 그 다음 숫자가 되는 피보나치수열일 것 같았습니다.

6개를 입력해야 하니, 0 1 1 2 3 5가 답이 될 것이라고 생각했습니다.

 

혹시나 bomb이 터질 것을 대비해서 exploed_bomb에 break를 걸어준 뒤 답이 맞는지 확인해봅니다.

터미널 화면

That's number 2. Keep going!

phase 2를 풀었습니다.

 

오랜만에 했더니 1도 모르겠습니다.

phase 1도 phase 2도 눈치껏 풀었습니다.

눈치챙겨

풀이,,,

예전에 과제할때 기억을 살려서 적어 봤습니다.

적으니까 조금 알것 같기도 했는데 모르겠기도 하고

과제할때도 느꼈었지만 전 정말 어셈블리어와 맞질 않다는걸 다시한번 깨닫고 있습니다.


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D