[시스템 프로그래밍] Bomb Lab Phase 5
disas phase_5 명령어로 phase_5의 어셈블리어를 조사하자.
+4줄에서 string_length 함수를 호출한다.
문자열의 길이? 어떤 함수일까?
뭔가 조건이 만족 될 때 까지 반복하는 함수 인 것 같다.
입력받은 문자열 내부를 순회하면서 문자열에 따라 특정 값을 계속해서 더하는 것 같은데.. 우선은 phase_5를 계속 조사하자.
다시 phase_5로 돌아와서, +9줄에서 string_length 함수의 반환값이 6과 같은지 검사하고, 6이 아니면 폭탄을 터뜨림을 확인할 수 있다.
그러면 phase_5의 입력 양식은 길이가 6인 문자열 일텐데..
일단 길이가 6인 아무 문자열이나 입력하고 디버깅해보자.
대충 aaaccc를 입력했다.
rdi 레지스터에 입력 값이 저장됨을 확인할 수 있다.
+0 ~ +14줄을 통해 rdi rbx rax는 모두 입력한 값을 가지고 있다.
+17줄에서 rdi에 rbx + 6 즉, 입력한 문자열이 끝난 바로 다음 주소를 저장한다.
+26 : rsi에 0x1675 + rip 값을 저장한다.
+33 : 레지스터의 크기를 변환한다. rax에는 입력한 값의 주소가 들어있기 때문에 edx에는 입력 문자열의 첫 번째 문자가 저장된다.
+36 : edx와 0xf를 and 연산한다.
edx에는 문자가 저장돼있으니, 아스키코드로 변환될 것이고 변환된 아스키코드를 16진수로 변환한 값이 and 연산의 대상이 된다.
지금은 aaaccc를 입력받았으니 첫 번째 글자는 a이고 a에 해당하는 아스키코드는 97이다.
97을 16진수로 표현하면 0x61이니, 0x61과 0xf를 and 연산 시 0x01을 얻는다.
+39 : ecx에 rsi + 4 * rdi 값을 저장한다.
+42 : rax에 1을 더한다.
rax는 입력 문자열의 첫 번째 문자를 가리키고 있었다.
이후 +46과 +49줄은 문자열을 모두 순회할 때 까지 위의 작업을 반복해서 수행함을 의미한다.
문자열을 모두 순회했으면 +51줄로 이동한다.
0x2a와 ecx의 값을 비교해 두 값이 같지 않으면 폭탄이 터진다.
문자열을 한 번씩 순회 할 때 마다 ecx에는 값이 쌓인다.
0xf와 and 연산을 수행하기 때문에 가질 수 있는 문자는 최대 16개이다.
그럼 어떤 문자열을 입력해야 하는지 알기 위해 rsi와 그 이후에 저장된 정수들이 어떤 값을 가지는지 확인해보자.
적당히 명령어를 수행한 뒤 rsi 뒤에 주석으로 표시된 주소를 확인해봤다.
ecx에 a가 저장되면 0xf 와 and 연산 시 1을 얻고, b가 저장되면 0xf와 and 연산 시 2를 얻는다.
1에 해당하는 숫자는 10, 2에 해당하는 숫자는 6이다.
꼭 알파벳 소문자가 아니더라도 and 연산 시 적당한 값을 얻을 수 있으면 된다.
string_length 함수에서는 문자열을 순회하면서 문자에 해당하는 숫자를 계속해서 누적하는 작업을 수행한다는걸 알 수 있다.
어쨌든, 맞춰야 하는 수는 0x2a이니 6개의 문자를 적절하게 조합해서 0x2a를 10진수로 변환한 42를 만들자.
a와 c를 사용해서 만들 수 있다.
a는 10에, c는 1에 해당하기 때문에 4개의 a와 2개의 c를 조합한 문자열을 입력하자.
'Computer Science > System Programming' 카테고리의 다른 글
[시스템 프로그래밍] Bomb Lab Phase Secret (0) | 2022.12.30 |
---|---|
[시스템 프로그래밍] Bomb Lab Phase 6 (0) | 2022.12.27 |
[시스템 프로그래밍] Bomb Lab Phase 4 (0) | 2022.12.24 |
[시스템 프로그래밍] Bomb Lab Phase 3 (1) | 2022.12.23 |
[시스템 프로그래밍] Bomb Lab Phase 2 (0) | 2022.12.22 |
댓글
이 글 공유하기
다른 글
-
[시스템 프로그래밍] Bomb Lab Phase Secret
[시스템 프로그래밍] Bomb Lab Phase Secret
2022.12.30 -
[시스템 프로그래밍] Bomb Lab Phase 6
[시스템 프로그래밍] Bomb Lab Phase 6
2022.12.27 -
[시스템 프로그래밍] Bomb Lab Phase 4
[시스템 프로그래밍] Bomb Lab Phase 4
2022.12.24 -
[시스템 프로그래밍] Bomb Lab Phase 3
[시스템 프로그래밍] Bomb Lab Phase 3
2022.12.23