[BombLab] 1251056

안우진·2024년 2월 20일

BombLab

목록 보기
1/9

밤랩을 야매로 빠르게 푸는 것을 기록합니당.

gdb bomb 로 디버깅 시작해주고

[phase_1]

[phase_2]

입력값 a1a_1, a2a_2, ... , a6a_6 는 각각 %rsp, 0x4(%rsp), .. , 0x14(%rsp) 와 대응된다.
<+30>, <+36> 보면 a1a_1, a2a_2는 각각 0, 1이다.
<+51>부터 <+78>을 보면 %rbx + 0x4(%rbx) == 0x8(%rbx) 인지 확인하고,
맞다면 %rbx에 $0x4를 더해주고, 아니면 터진다.
답은 피보나치 수열의 일부분인 0 1 1 2 3 5 이다.

[phase_3]

입력 받는 부분을 보니 %d, %c, %d이고 입력 개수를 2개보다 많이 넣어야 한다.
그리고, 0x10(%rsp)가 7보다 크면 터진다.
<+70>에 jmp가 보이는데

뭔가 0x10(%rsp)가 0이라면 0x400f62 로 갈 것 같다.

0x69 는 i 이고, 0x33c는 828이다.
0 i 828 입력하면 phase_3 은 통과된다.

[phase_4]

입력은 %d %d 이고 %rsp는 0xe보다 작거나 같은 값.
%rsp가 func4를 들어갔다 나와서 리턴값이 %eax 일거고
%eax랑 0x4(%rsp)가 0x13이여야 한다.
func4를 뜯어봐도 되지만 0부터 14까지 최대 15번 반복하면 답을 맞출 수 있긴 하다.
4를 넣으면 19가 반환되기 때문에 4 19 를 넣으면 통과된다.
secret_phase를 위해 4 19 DrEvil 로 입력해야한다.

[phase_5]

입력 값은 %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 라고 할 수 있다.

결론, 답은 5 115 이다.

[phase_6]

입력을 6개 받고, 쭉 보다 보면 입력값에 중복을 확인하는 2중 루프가 보이고..

<+36> 에서 mov %rsp %r12를 해주고 위에 사진처럼 <+116>부터 하나 씩 7로 빼주기 시작한다.
일부러 햇갈리라고 꼬아뒀나보다.

<+181> 쪽에서 0x6024f0을 가지고 반복을 하면서 무언가를 하더라. 그래서 다 끝나고 확인해봤다.

<+252> 쪽에 break를 걸고 %rbx를 확인해봤다. -0x20을 한 것은 실수로 c를 쳐서 예쁘게 보이게 하려고 했다.
phase_6 진입할 때 임의로 3 4 5 6 1 2를 치고 들어갔다. (<+116>에서 7로 빼줬으니 4 3 2 1 6 5라고 생각하자.)
node+0x8 부분이 변화한 것을 알 수 있다. node+0x8 이 의미하는 것이 다음 노드의 주소이다. <+181> 쪽에서 반복문을 수행하면서 node+0x8 부분을 입력값에 맞게 변화시킨 것이다.
즉, 위 입력 상황에서 node4 node3 node2 node1 node6 node5 순서대로 방문한다.

이제 마지막이다.

우선, dataidata_iii번째에 방문하는 nodexnode_x라고 하자.
%rbx가 dataidata_i 라면, %eax는 datai+1data_{i+1} 이고 %eax <= %rbx 여야 폭탄이 안터진다.
즉, dataidata_i내림차순이 되도록 입력값을 조절하여 방문하는 node도 내림차순이여야 한다.
<+181> 의 0x6024f0을 보면 node2, node5, node4, node3, node6, node1 으로 하면 내림차순으로.. 2 5 4 3 6 1이 답이라고 생각하겠지만 위에서 7로 빼줬기 때문에,
최종적으로 5 2 3 4 1 6이 답이다.

[secret_phase]

입력값 %eax-1가 0x3e8보다 작거나 같아야 하고, fun7을 통과하고 나서 0x1이여야 한다.
0x604110과 fun7은 다른 게시글에서 다루는 걸로 하고,
답은 40, 45, 50 셋 중 아무거나 하면 된다.

[run]

끝~

0개의 댓글