
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에 저장되는 우리의 입력값이 overwri..

Overview (gdb) disas touch2 touch2 함수의 구성을 살펴보자. touch2 함수는 argument 하나를 %rdi를 통해 받는다. 에서 %edi와 cookie값을 비교하며, 두 값은 같아야 한다. Buffer의 크기 등은 phase 1과 같다. 그럼 동일하게 buffer overflow를 발생시키고 touch2의 주소로 덮어씌우되, 그 전에 %rdi에 cookie값을 넣어주어야 한다. Code Injection Buffer의 크기는 24B, char로 24자리. getbuf에서는 입력한 string의 각 char를 buffer의 가장 바닥부터 채운다. getbuf에서 ret가 실행되면 buffer 위에 있는 return address로 이동하여 해당 위치부터 instruction..

Attacklab 시스템프로그래밍 Lab3 Attacklab이 나왔다. Bomblab에 이어 assembly를 다루는 과제이다. Bomblab이 gdb로 한 줄 씩 실행하며 폭탄이 터지지 않는 입력값을 찾는 문제였다면, Attacklab에서는 주어진 코드의 취약점을 파악하고 원하는 결과를 내는 입력값을 찾는다. 그 과정에서 Code injection(phase 1, 2, 3)과 return-oriented programming(phase 4, 5) 기법을 사용하게 된다. Overview (gdb) disas getbuf (gdb) disas touch1 getbuf, touch1 함수의 구성을 살펴보자. 우리의 목표는 비정상적으로 긴 길이의 입력값을 이용해 return address를 덮어씌워 touch..