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

[BombLab] phase_1 해설

by 잔디🌿 2024. 9. 2.

    이제 본격적으로 문제를 풀어볼거다!

     

    이렇게 bomb을 실행하고 r(run)명령어로 실행하면 환영 메세지가 나옵니다. 이제 이 밑에다가 phase_1의 정답을 찾아 입력하면 된다.

    이 때 bomb에 break 안걸고 오답을 입력하면 폭탄이 터진다! 주의!!

    phase_1 disassemble

    우하하 이제 실전이다

    간단하게만 설명하자면

    맨 위와 아래에 sub와 add는 별 신경쓰지 않아도 된다

    <+4>에서 esi에 어떤 값이 들어갑니다. 이 값이 뭔지 한번 뜯어보겠다

    스포를 하자면 여기에는 문자열이 들어있다. 아마 모든 분들의 esi에는 문자열이 들어있을것이다

     

    실행하면서 레지스터 값 확인하기

    밤랩의 핵심은 특정 instruction이 실행될 때의 레지스터값을 확인하는 것이다

    이를 위해서는 미리 phase_1에 breakpoint를 걸어두고 실행한 후 정답을 입력해보면 된다.

     

    저는 현재 정답을 모르니 아무 문자나 입력했다

    hi spg

    이 때 phase_1을 disas해보면

     

    아까 못보던 화살표를 볼 수 있다. 여기서 ni 명령어를 입력해보고 다시 disas 해보면

     

    한 칸 내려온 것을 볼 수 있다. 이처럼 ni는 instruction을 한 줄만 실행하도록 해준다.

    이 때 제가 x/s등의 명령어로 레지스터 값을 확인하면 현재 위치인 mov코드가 실행될 때의 값을 확인할 수 있는 것이다.

     

    이런식으로 원하는 위치만큼 실행을 시키고 레지스터 값을 확인해주면 된다! 이것만 잘 파악해도 문제풀이가 훨씬 쉬워진다.

     

    나는 지금 위치에서 esi에 어떤 값이 들어가고있는지 염탐해보겠다.

    오 문자열이 들어있는 것을 볼 수 있다! 저번 시간에 rsi에 파라미터 값이 들어간다고 했었는데, 이 이후에 string_not_equal 함수가 호출되는 것을 보니 여기 넘겨주는 문자열같다!

     

    사실 저게 정답이다ㅎㅎ 따옴표는 빼고 입력해야한다. 근데 우리는 보고서를 써야하기 때문에 더 자세히 설명해주겠다.

     

    함수를 호출 한 후 eax에 있는 값을 test하는 것을 볼 수 있다. eax끼리 and연산을 하고 ZeroFlag가 0인지 확인한다 0이어야 23번 instruction으로 이동하고, 0이 아니면 이동하지 않아 다음 instruction인 bomb이 실행된다.

    rax는 함수의 리턴 값이 저장되는 곳이다. 즉, string_not_equal의 리턴 값이 0이어야 한다는 것을 알 수 있다.

     

    strings_not_equal disassemble


    그 다음 strings_not_equal을 disas해보겠다.

    길고 복잡해요 근데 우리는 여기서 흐름만 파악해보겠다.

    우선 4,7번째 줄을 보면 파라미터로 받은 값들을 함수 내부에서 사용할 레지스터에 옮기는 것을 볼 수 있다.

    그럼 이 값들이 뭔지 확인해보겠다. 함수가 실행 된 후에는 rdi, rsi 값이 바뀌기 때문에 함수가 실행되기 전인 상태(phase_1의 <+4> 부분에 화살표가 위치할 때)에서 레지스터 값을 확인해야한다.

     

    rsi에는 위에서 확인했던대로 정해진 문자열이 들어간 것을 볼 수 있고, rdi에는 우리가 입력한 문자열이 들어간 것을 볼 수 있다

     

    그럼 이값들을 받는 rbx와 rbp가 코드에서 어떤 식으로 쓰이는지 보겠다.

    우린 리턴 값에 0이 들어가야한다

    그럼 들어가면 안되는 줄은 <+87>과 <+94> 이다.

     

    87과 94로 jump 하는 이유를 보면 rbp값과 al값이 달라서인 것을 볼 수 있다.

     

    참고로 al 레지스터는 rax레지스터의 일부이다.

    <+36>에서 rbx의 값의 값을 eax에 넣는 것을 볼 수 있었다.

     

     그리고 rbp를 1씩 계속 더해가는 것도 볼 수 있다. 이로서 rbp에 있는 값과 eax에 있는 값이 다르면 폭탄이 터진다, 즉 처음으로 돌아가면 rsi와 rdi에 들어가는 값이 같아야한다 라는 것을 알 수 있다.

     

    정답

    내 정답은 "Border relations with Canada have never been better."였다!
    phase_1에 breakpoint가 걸렸지만 c(continue) 명령어로 쭉 실행하도록 하였더니 성공 메세지가 떴다.

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

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