[시스템 프로그래밍] Bomb Lab Phase 3
disas phase_3로 phase_3 함수를 어셈블리어로 조사해보자.
+35줄에서 정수를 입력받는 것 같다.
phase_2처럼 +28의 source 부분에 입력값의 형태가 저장돼 있을 것 같다.
어떤 형식으로 입력받는지 살펴보자.
ni 명령어로 한 줄 씩 읽어가면서 source 부분을 확인해봤다.
정수 2개를 입력받는 것 같다.
적당히 break를 설정하고 두 개의 숫자를 입력해서 다시 실행해보자.
대충 3 4로 입력했다.
+40줄에서 1과 eax의 값을 비교한다.
그러면 eax의 값을 알아야 하는데..
다시 한 줄 씩 실행하면서 확인해보자.
+40줄 까지 진행한 후 레지스터의 상태를 확인해보니 rax 레지스터에는 2가 저장돼있음을 확인할 수 있다.
+43줄에서 jle 명령어가 실행된다. 2는 1보다 크기 때문에 jle가 실행되지 않고 폭탄이 터지는걸 피할 수 있다.
계속 진행해보자.
+45줄에서 7과 rsp에 있는 값을 비교한다.
rsp에는 어떤 값이 있을까?
3이 저장돼있다.
처음에 3 4를 입력했었는데, 처음에 입력한 3이 저장돼있는 것 같다.
+49줄을 살펴보니 첫 번째로 입력한 값이 7보다 크면 폭탄이 터지게 된다.
첫 번째 정수는 7이하인 정수 인 것 같다.
이후 +51 ~ +68 까지는 입력값을 적절하게 조작하는 부분이고..
+70줄에서 폭탄이 터지기 때문에 +68에서 어디로 점프할지가 중요해진다.
다시 한 줄씩 실행하면서 +68줄에서 rax레지스터가 어떤 값을 가지는지 확인해보자.
+68줄에서 rax 레지스터에는 0x555554013a8 값이 저장돼있다.
0x55554013a8은 어디일까?
+91줄이다.
+91줄에서 0x122값을 %eax에 넣고 +143으로 점프함을 알 수 있다.
+143에서는 0x4(%rsp) 와 %eax값을 비교한다.
0x4(%rsp)는 두 번째로 입력한 수이고, %eax에는 이전에 넣었던 0x122값이 저장돼있다.
+147에서 cmp연산의 결과에 따라 폭탄을 터뜨린다.
즉, eax와 두 번째로 입력한 수는 같아야 한다.
0x122는 10진수로 290이다.
두 개의 정수를 입력받는건데..
그럼 답은 3 290 인가?
확인해보자.
정답임을 확인할 수 있다.
+154줄 이후는 대충 함수를 리턴하는 부분이다.
처음 두 개의 숫자를 입력받을 때 1~7 사이의 수를 입력받을 수 있는데, 첫 번째 숫자로 뭘 입력받는지에 따라 두 번째 숫자가 정해지는 것 같다.
중간에 수많은 mov와 jmp가 있었으니.. 아마 C언어로는 switch문법으로 작성됐을 것 같다.
'Computer Science > System Programming' 카테고리의 다른 글
[시스템 프로그래밍] Bomb Lab Phase 5 (0) | 2022.12.25 |
---|---|
[시스템 프로그래밍] Bomb Lab Phase 4 (0) | 2022.12.24 |
[시스템 프로그래밍] Bomb Lab Phase 2 (0) | 2022.12.22 |
[시스템 프로그래밍] Bomb Lab Phase 1 (0) | 2022.12.21 |
[시스템 프로그래밍] Data Lab (0) | 2022.12.20 |
댓글
이 글 공유하기
다른 글
-
[시스템 프로그래밍] Bomb Lab Phase 5
[시스템 프로그래밍] Bomb Lab Phase 5
2022.12.25 -
[시스템 프로그래밍] Bomb Lab Phase 4
[시스템 프로그래밍] Bomb Lab Phase 4
2022.12.24 -
[시스템 프로그래밍] Bomb Lab Phase 2
[시스템 프로그래밍] Bomb Lab Phase 2
2022.12.22 -
[시스템 프로그래밍] Bomb Lab Phase 1
[시스템 프로그래밍] Bomb Lab Phase 1
2022.12.21