촉촉한초코칩

(**) BombLab 4 본문

Study/System

(**) BombLab 4

햄친구베이컨 2024. 5. 9. 19:01
4번 

 

phase_4 분석 

cmp eax, 0x2
$0x2와 %eax를 비교해서 같지 않으면 phase_4+41 실행 
phase_4+41 = explode_bome
즉, 두 값이 같아야 함 

cmp DWORD PTR[rsp+0x8], 0xe
jbe : a가 b보다 작거나 같을 때 
두 값을 비교해서 두 값이 같거나 앞이 더 작을 때 넘어간다. 아니면 46번째 줄로 이동
즉, a가 더 커야 한다? 

cmp eax, 0x2

입력을 받고 cmp하는 부분에서 bp를 걸어서 eax에 어떤 값이 들어있는지 확인한다.  

gdb에서 entry가 안 돼서 pwndbg로 다시 설치...  https://github.com/pwndbg/pwndbg

일단 0을 입력하고 eax에 어떤 값이 있는지 확인해봤는데 

그러면 입력값은 1???

10을 입력하고 ni로 진행해도 explode_bomb로 이동하게 됨.... 

> 라업을 보니... eax와 비교하는 2는 입력값의 개수였다. ㅎ  

 

cmp DWORD PTR[rsp+0x8], 0xe

cmp부분에 bp 걸어서 rsp의 값을 확인해본다. 
rsp에 8을 더하는 걸 보니 그냥 입력값을 뜻하는 것 같다. 

e는 14이므로, 입력값은 14보다 작거나 같아야 한다.  

 

call 0x400fc3 <func4>
test eax, eax
jne 0x401058 <phase_4+76>

func4를 실행한 후 test를 실행하는데, jne는 두개의 값이 같지 않을 때, 0이 아닐 때 해당 주소로 점프한다. 
그렇다면 test의 값은 0이 되어야 한다. 

일단 func4를 분석해본다. > 0 ~ 15 해석,, 

  • rsp = rsp - 8
  • eax = edx
  • eax = eax - esi
  • ecx = eax
  • ecx << 0x1f (31)
  • eax = eax + ecx
  • eax >> 1

32번째

eax = eax + eax

func4에서 한줄씩 실행해본다. 

일단 아무 값(1,2) 이나 입력하고 func4에서 위 연산들로 인해 값이 어떻게 변하는지 봤는데, 값이 점점 줄어들면서 0이 될 때 func4를 빠져나온다. > test 후 실행되는 폭탄은 피함!! 

즉, func4는 0이 되어야 빠져나온다. 

 

cmp dword ptr[rsp+0xc], 0
je phase_4+81

rsp와 0을 비교하고 만약 같으면 폭탄에서 넘어간다. 

rsp는 입력값을 뜻하는데, 여기서 0xc인 12를 더하니까 두번째 입력값이 된다. 

즉, 두번째 입력값은 0이 된다. 

 

1, 0입력했는데 phase_4가 해제되었다...

 

첫번째 값을 모르겠어서 10을 입력했는데, 그러면 폭탄이 실행됐다.

func4의 첫번째 명령어가 rsp = rsp - 8인데, 이부분이 첫번째 값을 가리키는 것 같기도 하다... 

그 부분은 나중에 더 해보자..