본문 바로가기
CSE/시스템프로그래밍

[BombLab] phase_5 해설

by 잔디🌿 2024. 9. 10.

    이제 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