이제 phase_5 해설을 해보겠다.
phase_5 disassemble
phase_5의 전체적인 코드는 위와 같다.
나는 임의로 hispgs를 입력하였다.
<+24>를 보면 string_length를 호출하고 리턴값인 eax의 값이 6인지 확인한다.
이를 통해 입력되어야 하는 값은 6글자의 string이라는 것을 유추할 수 있다.
그 다음 쭉 내려가보면 eax에 0을 넣는 과정을 거치고 41번부터 70번을 6회 반복한다. 이를 통해 한 글자씩 어떤 변형을 하는구나! 라는 것을 알 수 있다.
이후 strings_not_equal을 통해서 두 string을 비교한다. 이건 phase_1에도 나온 함수이다.
이 떄 esi에 특정 주소에 있는 값을 넣는다. 이 값을 꺼내보면
flyers라는 string이 나온 걸 볼 수 있다. 이로써 우리가 입력한 어떤 문자열이 변형된 결과가 flyers가 나와야 한다는 것을 유추할 수 있게 되었다.
그럼 다시 41번으로 가자
41번이 실행될 때 rbx가 쓰인다. 이 rbx에 어떤 값이 들어있나 꺼내보니
이렇게 입력한 값이 들어있는 것을 볼 수 있었다. 이를 1byte씩 16진수로 보면
이렇게 한 byte에 char 하나가 들어있는 것을 볼 수 있다.
첫 줄에서는 rbx에 rax만큼을 더한 값의 주소에 있는 값을 ecx에 넣는다. 현재 rax에 있는 값은 0이고, 한번 돌 때마다 rax에 있는값은 1씩 증가한다. 즉 여기서는 ecx에 각 문자가 한번씩 들어갈 것이라는 것을 유추할 수 있다.
그 다음 rsp에 ecx에 있는 값을 넣는다. (cl은 rcx, ecx와 같이 rcx의 끝부분만 사용한다고 보면 된다. 근데 어차피 앞부분은 0이니까 걍 rcx라고 생각하면 됨)
이후 48에서 rsp에 있는 값을 rdx에 넣는다. 그 다음 rdx에 있는 값과 0xf를 and연산한다.
0xf는 000.... 0000 1111이니까 이 값과 and 연산을 하면 그 값의 끝 4bit만 남는다. 즉 edx의 끝 4비트만 남기겠다는 뜻이다.
55번에서는 0x4024b0으로부터 rdx의 끝 4비트 만큼 떨어진 주소의 값을 edx에 넣는다.
그럼 0x4024b0에 어떤 값이 들어있나 확인해야한다.
이런 값이 들어있다.
이것은 0x4024b0에는 m이 들어있고, 0x4024b0 + 0x1이면 a가 들어있다는 것을 의미한다.
이후 해당 값을 rsp + rax + 0x10의 주소 안에 넣는다. 그런데 이 값을 어디다가 쓰느냐!
잠시 아래로 내려가겠다.
바로 반복문을 다 수행한 후 rdi에 넣는 과정에 사용된다. 아까 $0x40245e에는 flyers가 들어있는 것을 확인했다. 즉 반복문의 결과물이 들어있는 0x10+rsp에는 flyers가 들어있어야한다는 것이다.
다시 올라가면
각 문자마다 rbx에 들어있어야 할 값은
f : 9
l : 15(f)
y : 14(e)
e : 5
r : 6
s : 7
니까 우리가 입력한 char의 아스키코드값의 마지막 4비트가 위 수를 가지고 있으면 된다.
이 때 16진 중 마지막부분이 위에 문자랑 일치하는 char들을 찾아야 한다.
나는 소문자 안에서 찾으면 ionefg 이다.
정답
ionefg
다음으로 가자!!
'CSE > 시스템프로그래밍' 카테고리의 다른 글
[BombLab] 환경설정 (1) | 2024.10.06 |
---|---|
[BombLab] phase_6 해설 (0) | 2024.09.11 |
[BombLab] phase_4 해설 (0) | 2024.09.09 |
[BombLab] phase_3 해설 (0) | 2024.09.03 |
[BombLab] phase_2 해설 (0) | 2024.09.02 |