phase1 풀이 : https://warroom.tistory.com/114

 

[Bomb_lab]-Phase 1

해당 문제를 실행하면 이런 문장이 보여집니다.. 우선 gdb를 이용해 천천히 분석해보겠습니다. 해당 문제는 보호기법이 심하게 걸려있지 않아 코드를 그대로 볼 수 있게 되어있었습니다. 보면 우선 read line 함..

warroom.tistory.com

 

다음 문제를 풀어보겠습니다.

이번에는 phase_2를 분석해 보기 위해 0x12a4로 접근합니다

phase_2

보시면 우선 read_six_numbers라는 함수가 눈에 띔으로 해당 함수부터 분석을 하겠습니다.

read_six_numbers

우선 sscanf함수가 쓰인것을 볼 수 있습니다. 코드를 보면 0x2d51에 있는 문자열을 확인해 값을 몇개나 입력 받는지 알 수 있을 것 같습니다.

물론 해당 문자열확인 방법 외에도 sscanf함수가 인자를 6개 받는다는 것을 알 수 있습니다. 64bit Linux 운영체제에서는 인자값을 전달하는 레지스터를 순서대로 사용합니다. `rdi, rsi, rdx, rcx, r8. r9`가 해당 순서입니다. 따라서 위  read_six_numbers함수의 코드를 보시면 rsi에 해당하는 값이 이미 존재하는 상태에서 rdx에 값을 그대로 넣고, rcx에는 `rsi+0x4`, r8에는 `rsi+0x08`순으로 들어가게 됩니다. 해당 코드를 대충 생각해 보면 `sscanf("data1, "%d %d %d %d %d %d", data2, data2+4, data2+8. data2+ 12, data2+16, data+20)`이런 식으로 코드가 작성 되었다는 것을 생각할 수 있습니다. 그 뒤에 eax값과 5를 비교하는 코드가 존재합니다. jle임으로 `eax<=5`일 경우 explode_bomb로 가는 것을 알 수 있습니다. 따라서 eax는 6이여야 합니다. (참고로 eax는 sscanf의 return값)

 

자 이제 다시 read_six_numbers로 돌아가 생각해 보면 위 부분이 핵심인 것을 알 수 있습니다. `mov rsi, rsp`코드는 rsi에 rsp의 스택주소를 넘겨주고 해당 값을 인자로 받습니다. 해서 위에서 `rsi+알파`가 들어간 것입니다. rsi에 들어간 값들은 rsp에서 offset값으로 주소를 참조하면 각각 값이 들어있는것을 볼 수 있습니다. 다음  코드들을 보면 `DWORD PTR [rsp], 0x0`과 `DWORD PTR [rsp+0x4], 0x1`가 작성되어있습니다 DWORD PTR은 4바이트씩 참조한다는 말이고, []는 주소를 참조한다는 말 임으로, 아까 sscanf에서 넣어준 data2와 data2+4를 가르키는 것을 알 수 있습니다. data2 참일 경우와 data2+4가 1이 아닐 경우 참이여서 explode_bomb을 실행시키기 때문에 data2 = 0, data2+4 = 1인 것을 알 수 있습니다.

다음 핵심부분은 해당 코드 입니다.

보시면 rbx에 rsp주소를 담는것을 볼 수 있습니다. 그 뒤 phase_2+66으로 뛰어 eax를 사용해 연산하는 것을 볼 수 있습니다. 연산한 결과값을 rbx+8의 값과 비교하는데 해당 부분을 코드로 작성해보면 [rbx+8] = [rbx]+[rbx+4]가 됩니다. 따라서 해당 문제의 정답은 피보나치 수열이 된다는 것을 알 수 있습니다.

 

ps. 다른 문제들도 많이 풀어보았는데, 해당 문제는 보통 피보나치수열 혹은 2의 제곱수 나열이 정답인것 같습니다.

'computer_architecture > lab' 카테고리의 다른 글

[Bomb_lab]-Phase 3  (0) 2019.10.03
[Bomb_lab]-Phase 1  (0) 2019.09.11

해당 문제를 실행하면 이런 문장이 보여집니다.. 우선 gdb를 이용해 천천히 분석해보겠습니다.

main

해당 문제는 보호기법이 심하게 걸려있지 않아 코드를 그대로 볼 수 있게 되어있었습니다. 보면 우선 read line 함수를 이용해 입력을 받고, phase_1함수를 들어가는 것을 볼 수 있습니다.

phase_1

phase_1 함수를 열어보면 이런식으로 코드가 작성되어있는 것을 볼 수 있습니다.. 코드를 분석하면 `0x2aac`를 입력받은 값과 비교하는 strings_not_equal함수에 들어가는 것이 확인됩니다. 비교한 결과값이 같지 않을 경우 explode_bomb함수가 실행됩니다.

`0x2aac`를 보면 `Wow! Brazil is big.`이라는 문자열이 들어있는 것을 볼 수 있습니다.

해당 문자열을 입력하면 다음 단계로 넘어가는 것을 볼 수 있습니다.

 

아 참고로 해당 문제들은 파일마다 문제와 정답이 조금씩 다른 것 같습니다.

'computer_architecture > lab' 카테고리의 다른 글

[Bomb_lab]-Phase 3  (0) 2019.10.03
[Bomb_lab]-Phase 2  (0) 2019.09.11

+ Recent posts