이제 본격적으로 문제를 풀어볼거다!
이렇게 bomb을 실행하고 r(run)명령어로 실행하면 환영 메세지가 나옵니다. 이제 이 밑에다가 phase_1의 정답을 찾아 입력하면 된다.
이 때 bomb에 break 안걸고 오답을 입력하면 폭탄이 터진다! 주의!!
phase_1 disassemble
간단하게만 설명하자면
맨 위와 아래에 sub와 add는 별 신경쓰지 않아도 된다
<+4>에서 esi에 어떤 값이 들어갑니다. 이 값이 뭔지 한번 뜯어보겠다
스포를 하자면 여기에는 문자열이 들어있다. 아마 모든 분들의 esi에는 문자열이 들어있을것이다
실행하면서 레지스터 값 확인하기
밤랩의 핵심은 특정 instruction이 실행될 때의 레지스터값을 확인하는 것이다
이를 위해서는 미리 phase_1에 breakpoint를 걸어두고 실행한 후 정답을 입력해보면 된다.
저는 현재 정답을 모르니 아무 문자나 입력했다
이 때 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 |