전체 글 147

Stack Overflow

함수 호출 규약 함수의 호출 및 반환에 대한 약속. 한 함수에서 다른 함수 호출 시, 프로그램 실행 흐름이 이동한다. 호출한 함수가 반환하면, 다시 원래의 함수로 돌아와서 기존의 실행 흐름을 이어나간다. 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack Frame)및 반환 주소( Return Address)를 저장해야 한다. 호출자는 피호출자(Callee)가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 함수 호출 규약의 종류 x86(32bit) 아키텍처 = 레지스터의 수가 적음. 스택으로 인자를 전달함. x86-64 아키텍처 = 인자가 적으면 레지스터만, 인자가 너무 많을 때는 스택 사용. CPU의 아키텍처가 같아도 컴파일러가 ..

시스템 해킹 2022.08.18

gdb 분석 실습

※ 스택 프레임(stack frame) 메모리의 스택 영역 = 함수 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역. 함수의 호출과 함께 스택 영역이 할당되며, 호출 완료 시 소멸함. 함수가 호출되면 스택에는 - 함수의 매개변수 - 호출 끝난 후 돌아갈 리턴주소 값 - 함수에서 선언된 지역 변수 등이 저장된다. 스택 프레임 : 스택 영역에 차례대로 저장되는 함수의 호출 정보 -> 함수의 호출이 모두 끝난 뒤에, 호출되기 이전 상태로 되돌아갈 수 있다. 더이상의 여유 공간이 없을 때 또 다시 스택 프레임을 저장하면 데이터는 스택 영역을 넘어가서 저장되게 된다. -> 프로그램 오동작 / 보안상 취약점 발생 gcc -g test_gdb.c -o test 로 컴파일하고 gdb test 일단 드림핵에서 배..

시스템 해킹 2022.08.18

basic_exploitation_000 문제 풀이

void alarm_handler() { puts("TIME OUT"); exit(-1); } 일정 시간이 넘어가면 "TIME OUT"을 출력하고 에러 강제 종료한다. void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } 초기화하는 함수로 보인다. 이름이 같은 setvbuf가 두 개 있는데, 하나는 입력버퍼, 다른 하나는 출력 버퍼인 것 같다. signal() = 시그널 처리 방법을 설정하는 함수다. 얘가 알람 설정하는 놈인것같다. 30초 지나면 time out을 출력하도록 하는 놈인 것 같다. 위에 선언된 void alar..

시스템 해킹 2022.08.13

RSA 암호화 알고리즘 분석

RSA 알고리즘이란? 현대 컴퓨터 시스템 및 다른 전자기기에서 데이터를 암호화/복호화할 때 사용. 두 개의 다른 key를 사용하는 비대칭(asymmetric) 암호학 알고리즘이다. 유클리드 알고리즘(유클리드 호제법) 1. a,b 두 수가 주어짐.(a>b) 2. b가 0이면 a를 리턴함. 3. a가 b로 나눠 떨어지지 않으면 a를 b로, b를 a에서 b로 나눈 나머지를 대입하고 1번으로 돌아감. a = b b = a%b 위 코드를 temp = a%b a = b b = temp 이런 식으로도 쓸 수 있다. 유클리드 알고리즘을 이용해 38, 10의 최대공약수 구하기 38%10 = 8 a= 10, b= 8 (a에는 b, b에는 a%b 대입) 다시 나눈다. 10%8 = 2 a= 8, b=2 8%2= 0 최대공약수..

INCOGNITO 2022 2022.08.13

Buffer Overflow

버퍼(Buffer) : 시스템이 연산 작업을 하는데 있어 필요한 데이터를 일시적으로 저장하는 메모리 상의 저장 공간 문자열 처리 = 문자열 버퍼, 수열 = 숫자형 데이터 배열 대부분의 프로그램 = 버퍼를 스택에 생성함. 스택은 함수 내에서 선언한 지역 변수가 저장되게 되고 함수가 끝나고 나면 반환된다. - mallo()과 같은 반영구적인 데이터 저장 공간과는 다름. 동작 원리 버퍼 오버플로우 - 미리 준비된 버퍼에 버퍼의 크기보다 큰 데이터를 쓸 때 발생. 위 그림처럼 40바이트의 스택이 준비되어 있을 때 이보다 큰 데이터를 쓰면 버퍼가 넘치고 프로그램 에러가 발생하게 된다. - 41~44바이트 : 이전 함수의 base pointer 수정 - 45~48바이트 : retun address가 저장된 공간 침..

시스템 해킹 2022.08.12

pwnable.kr collision

MD5 Message-Digest algorithm 5 임의의 길이의 값을 입력받아서 128비트 길이의 해시값을 출력하는 알고리즘. 단방향 암호화로, 출력값에서 입력값을 복원하는 것은 일반적으로 불가능하다. 같은 입력값이면 항상 같은 출력값이 나온다. 흔히 패스워드 암호화에 많이 사용되며, 패스워드를 MD5로 해시해서 나온 값을 저장해둔다. 이 값만 봐서는 본래의 값을 알 수 없다. 패스워드를 제대로 입력했다면 같은 해시값이 튀어나올 것이기 때문에 본래의 키라는 것을 확인할 수는 있다. Hash Collision 해시 함수가 서로 다른 두 개의 입력값에 대해 동일한 출력값을 내는 상황. 해시 충돌과 관련된 문제로 보인다. 일단 주어진 서버에 접속한다. ls -al 로 어떤 파일들이 있는지 확인해봤다. 보..

시스템 해킹 2022.08.12

암호학 - 해시

해시 함수(Hash Function) 임의 크기의 데이터를 입력으로 받아서, 고정된 크기의 데이터를 반환하는 함수. 반환값 = 해시 값(Hash Value) 암호학적 해시 함수(Cryptographic Hash Function) : 해시 함수 중에서 특정 성질을 만족하는 함수 다음 성질을 만족한다. 1. 제 1 역상 저항성(Preimage Resistance) 암호학적 해시 함수 H에 대해 y가 주어졌을 때 H(x)=y를 만족하는 x를 찾는 것이 어렵다. 이는 함수가 일방향이어야 함을 의미한다. 2. 제 2 역상 저항성(Second Preimage Resistance) 암호학적 해시 함수 H에 대해 x가 주어졌을 때 이를 만족하는 x'을 찾는 것이 어렵다 3. 충돌 저항성 (Collision Resist..

Dreamhack 2022.08.12

SQL Injection(2)

Simple-SQLi 문제의 목표 : 관리자 계정으로 로그인하면 출력되는 flag 획득하기. 사이트에 접속하면 간단한 로그인 기능만을 제공하고 있음을 확인할 수 있다. Figure 1. 데이터베이스 구성 코드 DATABASE = "database.db" #데이터베이스 파일명 database.db로 설정 if os.path.exists(DATABASE) == False: #데이터베이스 파일이 존재하지 않는 경우, db = sqlite3.connect(DATABASE) # 데이터베이스 파일 생성 및 연결 db.execute('create table users(userid char(100), userpassword char(100));') #users 테이블 생성 #users 테이블에 관리자와 guset 게정..

Dreamhack 2022.08.11