목록분류 전체보기 (186)
Iriton's log
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. gdb & pwndbg gdb는 리눅스의 대표적인 디버거 오픈 소스 실습 https://github.com/scwuaptx/Pwngdb 가이드라인을 따라서 다운로드 후 // Name: debugee.c // Compile: gcc -o debugee debugee.c -no-pie #include int main(void) { int sum = 0; int val1 = 1; int val2 = 2; sum = val1 + val2; printf("1 + 2 = %d\\n", sum); return 0; } 해당 코드를 컴파일 한다. 컴파일 방법은 주석 참고 여기서 gcc 컴파일러 옵션의 -no-pie는..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 어셈블리어와 x86-64 x64 어셈블리 언어 명령 코드 데이터 이동(Data Transfer) mov, lea 산술 연산(Arithmetic) inc, dec, add, sub 논리 연산(Logical) and, or, xor, not 비교(Comparison) cmp, test 분기(Branch) jmp, je, jg 스택(Stack) push, pop 프로시져(Procedure) call, ret, leave 시스템 콜(System call) syscall 피연산자 상수 레지스터 메모리 []로 둘러싸인 것으로 표현되며 앞에 크기 지정자가 추가될 수 있다. 타입 BYTE - 1 WORD - 2 DW..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 리눅스 프로세스의 메모리 구조 세그먼트 리눅스에서는 프로세서의 메모리를 크게 5가지의 세그먼트로 구분한다. 용도에 맞게 적절한 권한을 부여할 수 있다는 장점이 있다. 코드 세그먼트 실행 가능한 기계 코드가 위치하는 영역으로 텍스트 세그먼트라고도 불린다. 프로그램이 동작하려면 코드를 실행할 수 있어야 돼서 r-x 권한이 부여된다. 쓰기 권한이 없는 이유는 공격자가 악의적인 코드를 삽입하는 것을 방지하기 위해서이다. 데이터 세그먼트 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치한다. CPU가 데이터를 읽을 수 있어야 하므로 r— 권한이 부여된다. data segment 쓰기 가능한 세그먼트 ..
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다. 컴퓨터 구조와 명령어 집합 구조 컴퓨터 구조 컴퓨터가 효율적을 작동할 수 있도록 HW, SW의 기능을 고안하고 구성하는 방법을 말함. 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다. CPU의 명령어에 대한 설계는 명령어 집합 구조(Instruction Set Architecture) - 명령어 설계 CPU의 하드웨어적 설계는 마이크로 아키텍처(Micro Architecture) - 회로 설계 폰 노이만 구조 중앙처리장치(Central Processing Unit, CPU) 연산, 제어 담당 산술논리장치 산술/논리 연산을 수행 제어장치 CPU 제어 레지스터 데이터 저장 기억장치 컴퓨터가 동작..
*본 포스트는 '리버싱 입문' 책을 참고하여 작성되었습니다. 1. 리버싱을 위한 프로그램 실행 구조 컴퓨터의 기본 요소 - CPU - 메모리 - 하드디스크 실행할 수 있는 파일(exe)은 기본적으로 HDD에 저장된다. 윈도우 상에서 이 실행 파일을 PE(Portable Executable) 파일이라고 부른다. PE 파일 구조 - Header: 중요 정보가 들어 있다. 해당 정보를 Loader가 분석해서 Body에 있는 Code와 Data를 메모리에 배치한다. - Body: Code, Data가 들어 있다. 메모리 구조 - 코드 영역: 프로그램 코드가 들어간다. - 데이터 영역: 정적 변수, 전역 변수가 들어간다.(고정된 값) - 스택 영역: 함수 호출 시 사용되는 매개 변수, 지역 변수가 들어간다. (코..
계산기를 띄우는 쉘 코드 제작 과정 필요한 것 windows OS stdafx.h와 windows.h 헤더 파일 (해당 포스트 맨 아래에 첨부) stdafx.cpp 파일 (해당 포스트 맨 아래에 첨부) 디버거 Visual Studio 순서 1. C++로 calc.exe 실행 코드 작성 2. 어셈블리어 3. Hex 값 4. Null Byte 제거 1단계, C++로 calc.exe 실행 코드 작성 #include "stdafx.h" #include "windows.h" int main(int argc, char* argv[]) { char cmd[5] = { 'c','a','l','c','\x0' }; WinExec(cmd, SW_SHOW); ExitProcess(1); } cmd 변수에 실행하고 싶은 ex..
스택 오버플로우를 이용한 리턴 주소 변조(또는 덮어쓰기) 실습을 진행하려고 한다. * 해당 실습은 window, Immunity Debugger, Python, CodeBlocks를 이용하였다. 취약한 타겟 코드 해당 코드에서 Integer Overflow 취약점을 찾을 수 있다. len len은 문자열 길이를 저장하는 변수이다. char 타입으로, 7 bit(1 bit는 부호)만큼 사용한다. 따라서 최대 값은 128이다. (2의 7제곱수) 128이 넘으면 음수로 인식을 하기 때문에 조건문 else가 아닌 if문이 수행된다. 스택 구조 파악 및 시나리오 주요 스택 구조는 위와 같다. 정상적인 작동에서는 buffer 범위 내에서만 값이 저장되어야 하는데, 비정상적인 작동 즉, Overflow를 이용하면 b..
해당 웹 페이지는 http가 포함된 url의 데이터를 불러와서 출력한다. 소스코드를 살펴 보면 11번째 줄에서 http가 포함되었는지 확인을 한다. 포함되지 않았다면 문자를 띄우며 실행되지 않지만, 포함되었다면 shell_exec 함수를 이용하여 curl 명령어를 실행한다. escapeshellcmd()란? 임의의 명령을 실행하기 위해 쉘 명령을 속일 때 쓰이는 문자열의 모든 문자를 escape 시킨다. &#;`|*?~^()[]{}$\, \x0A 및 \xFF. 해당 문자 앞에 백슬래시를 넣어서 실행되지 않게 하는 것이다. curl란? URL 요청에 대한 응답을 출력하는 게 기본값. Option -o : 응답을 임의의 파일에 저장 등등 escape 함수에서는 하이픈(-)을 필터링하지 않을 뿐더러, curl..