phase_4 의 핵심은 재귀함수인 func4 이다.
하지만 func4를 뜯어보고 하는 것은 의미가 없다고 생각한다.
다행히 입력 값 중 하나의 크기가 작아서 브루트포스로 풀어도 충분하다.
이 글에서는 phase_4와 func4 또한 3가지 종류가 있다는 것을 소개하고,
어떤 입력 값을 넣으면 func4가 어떤 값을 반환하는 지 알아보자.
경험상의 값을 적었으니 항상 참이라고는 보장할 수 없다.
밤랩 1251056, 1551016, .. 의 유형이다.
우선 x/s 0x40268f 를 하면 %d %d 가 나온다.
call 0x400bb0 을 하고 %eax가 2가 아니면 터진다.
<+43> 에서 %rsp가 0xe 보다 작거나 같아야한다.
이후 %edx, %esi, %edi(입력값)을 파라미터로 func4를 호출한다.
반환 값이 %eax 이고 이를 상수랑 비교한다.
0x4(%rsp)는 단순히 상수랑 비교해서 그나마 다행이다.
경험상 %rsp와 %eax의 관계는 다음과 같다.
index: %rsp, value: %eax
[11, 11, 13, 10, 19, 15, 21, 7, 35, 27, 37, 18, 43, 31, 45]
또한 %rsp, 0x4(%rsp) 는 %d %d 와 대응한다.
위 사진에서의 답은 4 19 이다.
밤랩 1451023, 1551002, .. 의 유형이다.
첫 번째 유형과 다르지 않아보인다.
두 번째 유형의 경험상 %rsp와 %eax의 관계는 다음과 같다.
index: %rsp, value: %eax
[0, 0, 4, 0, 613, 2, 6, 0, 1, 1, 5, 1, 3, 3, 7]
다행히 첫 번째 유형과의 관계와 값이 겹치는 부분이 없다.
이러한 사실로 유형을 구분할 수 있다.
정확히는 disas func4 로 구조가 다르다는 것으로 알 수 있다.
위 사진에서의 답은 1 0 으로도 할 수 있다.
밤랩 1551001, 1551003, .. 의 유형이다.
입력은 별반 다르지 않다.
다만 0x4(%rsp), %rsp 가 %d %d 와 대응한다.
이번엔 %rsp - 2 <= 2 를 만족해야한다.
이 문제는 %rsp에 아무 값을 넣고 %eax가 무엇이 튀어나오는지 확인하는게 제일 빠르다.
b *phase_4+72 하고 r 실행시켜서 대충 0 4 넣고 p $eax로 값을 확인하는 방법이다.
위 사진의 답은 48 4 이다.