목록분류 전체보기 (173)
Iriton's log
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 분석 취약점 분석/트리거 // Name: rao.c // Compile: gcc -o rao rao.c -fno-stack-protector -no-pie #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL); } int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf..
welcome Description 이 문제는 서버에서 작동하고 있는 서비스(welcome)의 바이너리와 소스 코드가 주어집니다. "접속 정보 보기"를 눌러 서비스 정보를 얻은 후 플래그를 획득하세요. 서버로부터 얻은 플래 dreamhack.io 리버싱 문제를 풀다가 nc 명령어로 지정된 호스트와 포트번호를 활용해서 서버에 접속할 수 있다는 걸 깨달았기에 써먹어 봤다. 플래그가 바로 떴다. 허무... 그래도 코드 분석을 해보자. flag 폴더를 연다. fseek 함수는 파일 포인터를 이동시키는 함수이다. ftell은 현재 위치를 long 타입 정수형으로 출력한다. 현재 위치가 파일의 끝이기 때문에(SEEK_END로 끝까지 이동했다.)파일 전체 크기를 반환해서 flag_len 변수에 넣은 거다. 다시 처음..
simple-operation Description 우리의 친구 아모가 미션을 주었습니다. "내가 원하는 결과가 나오도록 값을 입력해 줘!" 주어진 바이너리를 분석하고 알맞은 값을 입력하면 플래그가 출력됩니다. 플래그는 flag 파일에 dreamhack.io 풀이 코드의 흐름을 먼저 보자. 17-20: flag 파일을 열어서 파일 디스크립터를 fd 변수에 담는다. 45바이트만큼 읽어서 buf 변수에 받고 다시 닫는다. 21: 난수를 v6에 저장한다. 24: v7에는 사용자 입력값을 받는다. 25: v6 ^ v7 은 XOR 연산을 의미한다. 26: snprintf 함수는 출력 결과를 문자열 버퍼에 저장하는 함수이다. 버퍼의 크기를 지정하여 버퍼 오버플로우를 방지하는데 여기서는 9uLL로 지정했다. 9는 버..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 스택 버퍼 오버플로우 스택의 버퍼에서 발생하는 오버플로우 버퍼 CS에서 버퍼는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소의 의미로 사용된다. 데이터 처리속도가 다른 두 장치가 있을 때, 이 둘 사이에 오가는 데이터를 임시로 저장해 두는 것은 일종의 완충 작용을 한다. 이해를 돕기 위해 키보드에서 데이터가 입력되는 속도보다 데이터를 처리하는 속도가 느린 프로그램이 있다고 가정해 보자. 사 이에 별도의 장치가 없다면 키보드의 입력 중에 프로그램에서 수용되지 못한 데이터는 모두 유실될 것이다. 이런 문제를 해결하고자 수신 측과 송신 측 사이에 버퍼라는 임시 저장소를 두고 이를 통해 간접적으로 데이..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 함수 호출 규약 함수의 호출 및 반환에 대한 약속을 말한다. 한 함수에서 다른 함수를 호출할 때, 프로그램의 실행 흐름은 다른 함수로 이동한다. 그리고 호출한 함수가 반환하면 다시 원래의 함수로 돌아와서 기존의 실행 흐름을 이어나간다. 따라서 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장해야 한다. 또한, 호출자는 피호출자가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 함수 호출 규약을 적용하는 것은 일반적으로 컴파일러의 몫이다. 컴파일러가 호출 규약에 맞게 코..
Description 입력한 셸코드를 실행하는 프로그램이 서비스로 등록되어 작동하고 있습니다. main 함수가 아닌 다른 함수들은 execve, execveat 시스템 콜을 사용하지 못하도록 하며, 풀이와 관련이 없는 함수입니다. flag 파일의 위치와 이름은 /home/shell_basic/flag_name_is_loooooong입니다. 풀이 우선 문제 파일에 있는 c코드부터 봤다. main함수만 보라고 했으니 확인해 봤다. read 함수를 사용하며, 일반입력을 이용한다. 첫번째 인자의 0은 stdin을 의미한다. 강의에서 /tmp/flag처럼 파일 데이터를 읽어냈는데 이때 배운 orw shellcode를 작성해야 할 거 같다. 근데 이전 강의에서 배운 쉘코드를 직접 작성하여 실행하는 것이 너무 복잡할..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. Shellcode 익스플로잇을 위해 제작된 어셈블리 코드 조각 해커가 rip을 자신이 작성한 쉘코드로 옮길 수 있으면 해커가 원하는 어셈블리 코드를 실행할 수 있게 된다. 어셈블리어는 기계어와 거의 일대일 대응되므로 사실상 원하는 모든 명령을 CPU에 내릴 수 있게 된다. 쉘코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍처와 운영체제에 따라, 그리고 쉘코드의 목적에 따라 다르게 작성된다. orw Shellcode 작성 /tmp/flag 를 읽는 쉘코드를 작성해보자. 참고 systemcall syscall rax arg0 (rdi) arg1 (rsi) arg2 (rdx) read 0x00 uns..
실행 화면은 #0과 같은 프로그램이어서 어김없이 문자열을 찾아서 해당 코드로 이동했다. 0번 문제처럼 구성되어 있다. 분기점 전 호출되는 함수로 이동해 보자. eax와 문자를 하나씩 비교하는 것으로 보인다. 저 문자를 다 조합하다 보면 Compar3로 시작하는 Flag 값이 나온다. 문자열이 다 흩어져 있다는 걸 제외하면 #0, #1 둘 다 같은 난이도로 너무 쉬웠다. 그치만 어셈블리코드 분석 자체로 의미 있는 풀이였다.