개요

오늘 과외생 중 한 명이 디버거로 폭탄 프로그램을 해체하는 학교 과제를 들고왔기에 이 참에 어셈블리어 분석하는 방법을 포스트해보려 한다.

BombLab

Untitled

문제 이름은 BombLab이다. 실행파일이 하나 주어지는데, 이걸 실행하고 알맞지 않은 문자열을 넣으면 터져버린다.

우리의 목표는 이게 터지지 않는 KEY 문자열 을 찾는 것이다. (예시로 넣은 키는 “hello”)

디버거

교수님이 디버거 사용법에 대해서 알려주신게 없단다. 아무거나 쓰라는 모양…

과제 맨 마지막에 써본 디버거가 없으면 GDB를 써보라고 적혀있길래 GDB를 사용해보자~

1. GDB 시작
gdb -tui bomb

2. 어셈블리 코드 보기
layout asm

쉘에서 위와 같이 입력하면 gdb가 파일을 디스어셈블해서 어셈블리로 띄워줄 것이다~

Untitled

자. 대강 살펴보니, read_line으로 한 줄 받고 phase1, read_line으로 한 줄 받고 phase2, read_line으로 한 줄 받고 phase3 이런식으로 연달아 실행하는 전체 흐름을 알 수 있다.

Phase_2

phase_2 하나만을 기준으로 설명하겠다. 다음은 phase_2의 전체 코드다. (at&t는 보기 불편해서 intel 문법으로 바꿨다)

Untitled

천천히 분해해서 살펴보자.

함수 프롤로그/에필로그

Untitled

일단 함수 시작과 끝 프롤로그와 에필로그 부분을 떼어내자.

rbp, rbx를 보존하고 스택 프레임을 40 byte[0x28] 만큼 잡는걸 볼 수 있다.

함수 본문