Lab2: Bomblab (phase 3)
Overview
(gdb) disas phase_3
phase_3 함수의 구성을 살펴보자.
길이가 길다. 주요 부분만 살펴보자.
%rsp+0xc, 0x10, 0x14 위치를 rdx, rcx, r8에 미리 저장한다. 입력할 data는 세 개이고 stack의 해당 위치에 저장될 것이다. 입력값을 각각 x, y, z로 두자.
<+48> 입력한 data 개수가 2개 이하일 경우 폭탄이 터진다.
<+53> x는 100 이상이어야 한다.
Defusing phase 3
input int 3개(x, y, z)를 0xc(%rsp), 0x10(%rsp), 0x14(%rsp)에 저장
x >= 100 임시로 x = 100
60 eax에 x 저장
64 ecx에 x-100 저장
67 edx에 0x2e8ba2e9 = 780903145 저장
72 eax에 ecx == x-100 저장
74 eax와 edx 곱해서 앞 32bit는 edx, 뒤 32bit는 eax에 저장
76 edx arith right shift 1칸
78 eax에 ecx == x-100 저장
80 eax arith right shift 31칸
83 edx에서 eax빼서 edx에 저장
85, 88 eax에 edx * 11 저장
91 ecx에서 eax == edx * 11 빼서 ecx에 저장
93 0xc(%rsp)에 ecx 저장
97 ecx가 7 이하여야함
106 edx에 ecx 저장
108 rcx에 0x555555556d40 저장
6d40부터 4씩 끊어서
-6448 -6441 -6354 -6347
-6340 -6333 -6326 -6319
115 119 rax에 2 * rcx + 4 * rdx 저장
rdx 0일때 138로 이동
138 ebx에 0x53 = 83 저장
150 156 162 168 174 ebx에 0xcb = 203 더하기, 0x3e2 = 994 빼기, 0x382 = 898 빼기 -> 0xfffff9ba = -1606
180 184 ebx와 y 같아야함 => y = -1606
186 eax에 0xc(%rsp) 저장
190 193 339 342 eax == 1이면 edx에 rbx - 0x1 저장하고 306으로
199 202 299 eax == 0이면 edx 에 rbx + 0x5 저장
306 310 edx와 z 같아야함 => z = -1601