bomb lab의 phase5 다 이제 거의 다 왔다!! 이번 문제는 배열을 이해하고 약간의 트릭만 이해하면 쉽게 풀 수 있다 먼저 디스어셈블 한 어셈블리어를 봐보자 엄청 긴데 phase5까지 돌파한 우리에게는 그 닥 위협적이지 않다. 특히 따로 호출하는 함수가 없어서 오히려 쉽게 느껴진다. 그리고 쉽다.
40107a와 그 밑 부분을 보면 입력받은 string의 길이가 6인지 체크해준다 정답은 6글자이다. 다음 40108b부터 4010ac 까지 루프를 도는 것을 확인 할 수 있다. 루프의 기준은 rax이다. rax는 매번 cmp전에 1더해지고 6과 같지 않다면 루프를 다시 돈다. 뭔가 눈치채지 않았는가.. 그렇다. 아래 c코드로 변환한 것을 보면 조금 더 이해가 쉽다. 이 코드는 어셈블리를 이해하기 쉽게 만든 것이니 그걸 참고하고 보자.
내가 입력한 값이 저장되어 있는 rbx에서 한칸 씩 이동하며 글자를 저장하고 다시 이 글자를 0xf와 and 비트연산을 한 결과를 가져온다. 여기서 table은 주소 0x4024b0 에 저장되어 있는 값을 x/s 명령어로 가져온 것이다. 4010b3 부분을 보면 뜬금없이 0x40245e에 있는 값을 esi 즉 두번 째 인자를 전달하는 레지스터에 넣어주는데 여기에 암호의 정답이 들어있다. 답은 flyers다. 무언가 갑자기 아무 주소에서나 값을 가져온다면 여기에 힌트가 들어있을 확률이 높다. 아무이유없이 주소를 옮길 일 따위는 컴퓨터는 하지 않으니까. 그럼 원리는 간단해진다. 내가 입력받은 값에서 상위4비트만 추출해 입력되어 있는 배열에서 값을 가져와 flyers를 만들어주면 된다. 끝!
'공부 일지' 카테고리의 다른 글
CS:APP attack lab phase_3 (0) | 2018.07.27 |
---|---|
CS:APP Bomb lab Phase_4 풀이 (0) | 2018.07.11 |
CS:APP 3장 Machine Level Reprentation of Programs (0) | 2018.07.09 |