Flag={C0MPU73R}

(리버싱) 밤랩 bomb - phase_2 본문

사이버 가디언즈

(리버싱) 밤랩 bomb - phase_2

땡관 2018. 8. 25. 23:58

#bomb 문제는 phase_1 부터 phase_6까지 6개의 문제로 이루어져있다

#1단계부터 6단계까지 모두 맞춰야 폭탄이 해체되는 형식이다


문제를 실행한다



phase_1은 답을 알았기 때문에 바로 입력해준다


뭔가 또 입력할 수 있게 됬는데 gdb로 분석을 해봐야겠다



<read_six_numbers>라는 함수가 있다


아마 6개의 인자를 숫자로 넣어줘야 하는 것 같다




phase_2의 맨 처음에 break를 걸고 실행해준다


일단 "1 2 3 4 5 6"를 입력해줬다



첫번째 비교하는 곳 까지 왔다


rsp와 0x0을 비교해서 양수(+)면 점프하는 것 같다    #아마 js는 음수(-)면 점프


rsp의 값을 보면 첫번째 인자인 "1"이 들어있다



우린 양수(+)만 입력했기 때문에 통과되어 넘어왔다. 그 다음을 정리해 보면


rsp(인자"1")을 rbp에 넣는다 


ebx에 0x1을 넣어준다


ebx(1)를 eax에 넣고 그 다음 eax(1)에 rbp(인자"1")을 더해준다


rbp+0x4(인자"2")와 eax(2)를 비교해서 같으면 넘어간다


rbp+0x4의 값을 보니 두번째 인자 "2"가 들어가 있다 


0x4단위로 다음 인자가 들어있는 것 같다


eax(2)와 비교되는 우리의 두번째 인자 rbp+0x4에도 2가 들어있기 때문에


통과되고 다음으로 넘어간다


(eax=2, rbp+0x0=인자"1", ebx=0x1)




다음을 분석 해보면


ebx(0x1)에 0x1을 더한다 -- ebx(0x2)


rbp(인자"1")의 주소에 0x4를 더한다. 즉 다음 인자 값으로 넘어간다


ebx(0x2)와 0x6을 비교해서 같지 않으면 이전으로 점프한다


지금 ebx는 0x2이기 때문에 0x6과 같지 않아서 이전으로 점프한다


(eax=2, rbp+0x0=인자"2", ebx=0x2)



이전으로 돌아와서 다시 분석한다 


eax에 ebx(0x2)를 넣는다 -- eax(0x2)


eax(0x2)에 rbp+0x0(인자"2")를 더한다 -- eax(0x4)


세번째 인자 rbp+0x4(인자"3")과 eax(4)를 비교해서 같으면 점프한다


우린 여기서 세번째 인자가 4(eax)가 아니라 틀려서 폭탄이 터진다



세번째 인자를 4로 바꿔넣고 다시 돌려본다



인자 값을 바꾸고 +49로 돌아온 위치까지 왔다


여기서부터 다시 분석해본다


# (eax=2, rbp+0x0=인자"2", ebx=0x2)


eax(2)에 ebx(2)를 넣는다 -- eax(2)


eax(2)에 rbp+0x0(인자"2")를 더한다 -- eax(4)


세번째 인자 rsp+0x4(인자"4")와 eax(4)를 비교해서 같으면 통과한다


이번엔 세번째 인자로 "4"를 넣었더니 통과 되었다


여기까지 보면 두번째 인자에는 (첫번째 인자 + 1)


세번째 인자에는 (두번째 인자 + 2) 해서 통과 되었다


아마 더하는 값이 1씩 늘어나면서 더해지는 것 같다


따라서 처음에 1을 넣었으면 1 2 4 7 11 16


처음에 2를 넣었으면 2 3 5 8 12 17 


이런식의 알고리즘 문제같다



이렇게 답을 넣었더니 phase_2가 클리어 되었다


# 원래 끝까지 다 할라했는데 정리를 잘 못해서 너무 길어져서 끝냄 헤헤