본문 바로가기

Bomb Lab

[Bomb Lab] Phase3

<Bomb Lab이란?>

https://studyforall.tistory.com/98

 

[Bomb Lab]Bomb Lab이란?

Bomb Lab은 컴퓨터 사이언스로 유명한 카네기 멜론 대학교에서 만든 실습 프로그램이다. 이 프로그램을 통해 디버거 사용법을 익히고 바이너리 분석을 연습해볼 수 있다. 폭탄을 터뜨리지 않고 안

studyforall.tistory.com

 

실습 환경에 대해서는 위의 게시물 하단에 적어놓았다.

 

phase2에 이어 이제 phase3를 시작해본다.

disassemble phase_3 명령어를 입력하여 phase_3 함수를 처음부터 끝까지 어셈블리 코드로 출력해보았다.

첫인상: 이번에도 많은 비교(cmp)와 분기(jmp)가 보인다.

그런데 분기가 거의 다 unconditional jump 즉, 해당 줄에 도달하기만 하면 무조건 jmp하는 명령어이다.

그리고 모두 <+123>으로 jmp한다.

 

안전지대를 찾아보자.

<+134>에 도달하면 explode_bomb이 해체된 시점이다.

<+127>에서 je를 통해 <+134>로 jump할지 폭탄이 터질지가 결정된다.

je는 앞선 cmp에서 ZF가 1이 되어야 즉, 두 피연산자의 값이 같아야 jump한다.

따라서 안전지대로 가려면 <+123>의 cmp에서 eax와 [rsp+0xc]에 들어있는 값이 같아야 함을 알 수 있다.

 

<+34>에 첫번째 explode_bomb이 있다.

일단 이걸 넘어서야 그 다음으로 갈 수 있다.

그 위의 세 줄<+24><+29><+32>를 동적분석해보자.

 

먼저 hello라는 문자열을 입력해봤다.

그랬더니 <+29>시점에 eax가 0이었다.

그렇다면 cmp와 jg를 지나서 eax가 0x1보다 크지 않으므로 explode_bomb으로 프로세스가 흘러갈 것이다.

 

다음으로 1을 입력해봤다.

이번에는 <+29>시점에 eax가 1이었다.

하지만 여전히 eax가 0x1보다 크지 않으므로 explode_bomb으로 프로세스가 흘러갈 것이다.

 

다음으로는 1 2를 입력해봤다.

이번에는 <+29>시점에 eax가 2이었다.

eax가 0x1보다 크므로 폭탄을 피해갈 수 있다.

 

eax에는 입력한 숫자의 개수가 저장되는 것일까?

시험삼아 1 2 3을 입력했을 때도 eax는 2였다.

입력한 숫자의 개수를 저장하는데, 최대로 입력받는 개수가 2인가보다.. 라고 추측하고 넘어가기로 했다.

 

2개 이상의 숫자를 입력하는 것으로 <+34>의 폭탄은 해체했다.

다음 폭탄은 어디있을까?

<+44>에서 <+106>으로 jump하는데 거기가 explode_bomb이다.

따라서 여기에 두번째 폭탄이 있다고 볼 수 있다.

ja는 전자가 후자보다 크면 jump하는 명령어이다.

따라서 <+39>에서 [rsp+0x8]이 0x7보다 크면  폭탄이 터진다.

 

<+39>지점에서 [rsp+0x8]에는 어떤 값이 들어있을까?

해당 지점에 bp를 걸고 쭉 실행했다.

2개의 숫자는 5와 6을 입력해보았다.

rip가 <+39>지점에 멈춘 상태에서 x/6d $rsp 명령어로 rsp+8 주변의 값을 출력해보았다.

rsp+8지점에 5가 있고 rsp+0xc 지점에 6이 있다.

 

그렇다면 <+39>의 cmp문은 첫번째로 입력한 숫자를 7과 비교하는 비교문이다.

폭탄이 터지지 않으려면 첫번째 숫자는 0, 1, 2, 3, 4, 5, 6, 7 중 하나여야 한다.

 

그럼 첫번째 숫자를 1로 고정하고 두번째 숫자는 무엇이어야 하는지 추적해보자.

<+44>의 explode_bomb을 넘어오면 첫번째 숫자를 eax에 넣고,

그 값과 0x402470이라는 값을 연산해서 해당 주소 지점으로 바로 jump한다.

즉 첫번재 숫자에 따라 jump하는 목적지가 달라진다고 볼 수 있다.

 

<+50>에 bp를 설정해놓고 해당 지점에서 $rax*8+0x402470 주소에 있는 값이 무엇인지 출력해보았다.

첫번째 숫자로 1을 입력했을 때 나온 결과이다.

목적지 주소는 0x400fb9이다.

여기에서는 eax에 0x137을 입력한다.

초반에 살펴본 바에 따르면 0x137과 두번째 숫자가 같아서 폭탄을 해체할 수 있다.

따라서 첫번째 숫자가 1인 경우 두번째 숫자는 0x137, 10진수로 변환하면 311이어야 한다.

3단계 폭탄을 해체했다.

 

공부삼아 가능한 모든 숫자 조합을 찾아보았다.

0 207

1 311

2 707

3 256

4 389

5 206

6 682

7 327

 

'Bomb Lab' 카테고리의 다른 글

[Bomb Lab] phase4  (0) 2024.05.10
[Bomb Lab] Phase2  (0) 2024.03.24
[Bomb Lab] Phase1  (0) 2024.03.24
[Bomb Lab]Bomb Lab이란?  (1) 2024.03.24