[BombLab] phase_5 풀이

안우진·2024년 2월 21일

BombLab

목록 보기
6/9

[Type 1]

밤랩 1251056, 1551002, .. 의 유형이다.

입력 값은 %d %d, 입력 값의 개수는 1보다 커야한다.
0x402540을 보면

참 어지럽다.. +72에서 +89보면 계속 순환하는데.. 요약하자면..
0xf번 반복한 결과물이 0xf이여야 한다. 위에 사진 보면 0xf가 0x6번째에 있고, 0x6은 0xe에 있고..
f <- 6 <- e <- 2 <- 1 <- a <- 0 <- 8 <- 4 <- 9 <- d <- b <- 7 <- 3 <- c <- 5 <- f <- ..
이런 식으로 나타낼 수 있다. 즉 5부터 시작하면 0xf까지 0xf번 반복하면 된다.

위 사진 코드 설명)
몇 번 반복했는 지가 %edx. %rsp가 0xf일 때 %edx도 0xf여야 한다. 또한 0x4(%rsp)가 %ecx여야 한다.
%ecx는 여태 나온 수들의 합이라서 0부터 f까지 다 더한 120이라고 생각할 수 있는데,
<+48>에서 mov 하고 <+62>에서 %ecx를 초기화해주고 <+84>에서 더해주니까 결국 맨 처음 값은 포함이 안되기 때문에 %ecx는 120 - %rsp 라고 할 수 있다.

이 유형 상당히 마음에 드는데.. 안타깝게도 비교 상수 값이 여태 전부 0xf 이여서,
5 115 를 입력하면 정답일 것이다.

[Type 2]

밤랩 1451023, 1551001, .. 의 유형이다.

여기서 %rdi가 입력값이고 <+5> mov %rdi,%rbx를 실행한다.
입력은 문자열로 <+29> 를 보니 길이가 6이여야 한다.
<+44> 부터 %rbx+%rax 를 %edx에 넣고 있다. (0 <= %rax <= 5)
<+48> 에서 %edx를 0xf 로 나눈 나머지만 가져오고 (0 <= %edx <= 15)
<+51> 에서 다시 0x402500(%rdx)를 %edx에 넣는다.
<+61> 에서 %rsp+%rax에 %dl을 넣는다.
이걸 6번 반복하고, 0x4024af 랑 %rsp 랑 비교한다.

그러니까 0x402500에서 maduiersnfotvbyl 를 가지고 0x4024af를 만들어내도록 입력값을 줘야한다.
devils를 만든다고 해보자. d는 2번째에, e는 5번째, v는 12번, i는 4번, l은 15번, s는 7번에 있다.
입력값을 0xf 로 나눴을 때의 나머지가 2, 5, c, 4, f, 7 이 되도록 적당한 문자를 찾으면 되는데..
필자는 0x61 이 'a'임을 이용해서 beldog 라는 답을 얻었다.
아니면 0x30 이 '0'임을 이용해서 숫자로 해도 상관이 없다. 그럴 경우 답은 25<4?7 이다.
대충 p/c 0x32, p/c 0x62 이런식으로 알아보면서 한 글자면 상관없다.

0x61 'a' 를 기준으로 경험상 자주 나오는 단어 몇 가지 적어놓겠다.
flames = ioa`eg flyers = ionefg oilers = jdoefg sabres = gamfeg devils = beldog

[Type 3]

밤랩 1551003, 1551005, .. 의 유형이다.

짧아서 좋은 것 같다.
마찬가지로 문자열을 받는데 길이가 6이어야한다.
유형 2와 흐름이 비슷하다. 입력값을 하나하나 돌면서 0xf로 나눈 나머지를 취해주고,
0x402400(,%rdx,4)를 %ecx에 누적해서 더하고 있다.
이때, 누적 값인 %ecx와 상수를 비교하는 문제이다.

0x402400 은 위의 사진과 같다.
우리의 목표는 6개의 문자열을 변환해서 합한 값이 0x31 즉 49여야 한다.
필자는 간단하게 5*x + y 형태로 만들어주는 편이다. 그래서, 8*5 + 9로 가겠다.
숫자 8은 0xd번째 에 있고, 숫자 9는 0x6번째에 있다.
입력값의 나머지가 0xd, 0x6이 되도록 구성해주면 된다.

필자는 여기서 0x30이 '0' 임을 이용해서 답을 구성하는 것이 쉽다고 본다.
p/c 0x3d 의 값은 = 이다. 6은 그대로 6이므로 위 상황에서 정답은 =====6.
아니면 9*5 + 4 해서 666668 을 입력해도 정답이 된다.

0개의 댓글