오늘 과외생 중 한 명이 디버거로 폭탄 프로그램을 해체하는 학교 과제를 들고왔기에 이 참에 어셈블리어 분석하는 방법을 포스트해보려 한다.
문제 이름은 BombLab이다. 실행파일이 하나 주어지는데, 이걸 실행하고 알맞지 않은 문자열을 넣으면 터져버린다.
우리의 목표는 이게 터지지 않는 KEY 문자열 을 찾는 것이다. (예시로 넣은 키는 “hello”)
교수님이 디버거 사용법에 대해서 알려주신게 없단다. 아무거나 쓰라는 모양…
과제 맨 마지막에 써본 디버거가 없으면 GDB를 써보라고 적혀있길래 GDB를 사용해보자~
1. GDB 시작
gdb -tui bomb
2. 어셈블리 코드 보기
layout asm
쉘에서 위와 같이 입력하면 gdb가 파일을 디스어셈블해서 어셈블리로 띄워줄 것이다~
자. 대강 살펴보니, read_line으로 한 줄 받고 phase1, read_line으로 한 줄 받고 phase2, read_line으로 한 줄 받고 phase3 이런식으로 연달아 실행하는 전체 흐름을 알 수 있다.
phase_2 하나만을 기준으로 설명하겠다. 다음은 phase_2의 전체 코드다. (at&t는 보기 불편해서 intel 문법으로 바꿨다)
천천히 분해해서 살펴보자.
일단 함수 시작과 끝 프롤로그와 에필로그 부분을 떼어내자.
rbp, rbx를 보존하고 스택 프레임을 40 byte[0x28] 만큼 잡는걸 볼 수 있다.