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

[BombLab] phase_3 해설

by 잔디🌿 2024. 9. 3.

    phase_3 disassemble

    전체 코드이다. 점점 길어진다...

     

    우선 나는 임의로 숫자 4와 56을 입력했다.

     

    4를 보면 함수에 파라미터로 주기 위한 부분인 rdi에 무언가 들어가는 것을 볼 수 있다. 해당 주소에 있는 값을 보면

     

    이렇다. 이 값이 __isoc99_sscanf@plt에 들어간다는 것을 알 수 있고, 원하는 값은 정수 2개라는 것도 추측할 수 있다.

     

    위 함수가 호출된 후 eax에는 입력받은 숫자의 갯수가 들어간다.

    jg는 앞에 수가 뒤에 수보다 작을 때 분기한다. 즉 eax에 있는 값이 1보다 커야한다는 것을 알 수있다. 우리는 어차피 2개의 숫자를 입력할 것이기 때문에 자연스럽게 넘어가자

     

    39번을 보면 0x8(rsp)에 있는 값과 7을 비교하여, 7이 작으면 106번으로 분기하는 것을 볼 수 있다. 106번은 폭탄이다. 따라서 저기에 있는 값은 7보다 작거나 같아야한다.

    해당 위치에 있는 숫자를 꺼내보니 4가 나왔다. 즉 저기에는 첫번째로 입력한 수가 들어간다는 것을 알 수있다.

    -> 첫 수는 7보다 작거나 같아야한다.

     

    그 다음 첫번째로 입력받은 값을 eax에 넣는다. 

    이후 어떠한 주소를 계산해서 그 주소 안에 있는 값으로  jump한다.

    기억 안날 것 같아서 써두었다.

    저대로 하면 8 * rax값 + 0x402470에 주소값을 계산하면 된다.

    지금 rax에 4가 있으니까 이를 계산하면 0x402490이다.(16진수니까)

    이 속에 있는 값을 보면

     

    주소가 하나 나오는 것을 볼 수있다.

    그 주소로 가보자

     

    사실 ni를 사용해서 이동하면서 disas 하다보면 저절로 +78로 분기한다.

    위에 내용을 이해하고 원리를 알면 좋지만, 모르겠으면 그냥 따라가도 좋다

     

    eax에 0x185를 넣고 123으로 분기하는 것을 볼 수 있다.

     

    그 다음 0xc(%rsp)값과 eax값을 비교한다.

     0xc(%rsp)는 두 번째 입력한 값인 것 같지만 그래도 확인해보자

    맞다.

     

    아까 우리는 eax에 0x185를 넣었다. 이 값은 10진수로 389이다. 그럼 첫번째 수가 4이면 두번째 수는 389라는 것을 알 수 있다.

     

    참고!

    여기서 rax의 값을 확인해보면 

    이런게 뜬다. 이건 eax에 해당 숫자의 주소값이 아닌 그 숫자 자체가 들어있기 때문이다.

     

    그래서 이를 확인하려면 i r 명령어로 전체 레지스터 값을 확인하면 된다.

    여길 보면 rax에 

    389가 들어있는 것을 볼 수 있다.

    정답

    우리가 첫번째 수로 어떤 값을 넣느냐에 따라 두번째 수로 넣는 값이 달라진다.

    그런데 정답은 하나로 충분하니까 나는 여기서 마치겠다!

    벌써 절반이다 오예!

    'CSE > 시스템프로그래밍' 카테고리의 다른 글

    [BombLab] phase_5 해설  (1) 2024.09.10
    [BombLab] phase_4 해설  (0) 2024.09.09
    [BombLab] phase_2 해설  (0) 2024.09.02
    [BombLab] phase_1 해설  (0) 2024.09.02
    [BombLab] 환경설정 & 어셈블리어  (0) 2024.09.01