일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- XSS Game
- CSS
- 웹페이지 만들기
- siss
- BOJ
- c
- 백준
- WarGame
- 숙명여자대학교 정보보안 동아리
- hackerrank
- 숙명여자대학교 정보보안동아리
- c++
- 파이썬
- PHP 웹페이지 만들기
- BOJ Python
- hackctf
- C언어
- The Loard of BOF
- SWEA
- Javascript
- 기계학습
- 풀이
- HTML
- 자료구조 복습
- Sookmyung Information Security Study
- 머신러닝
- 생활코딩
- Python
- 드림핵
- lob
- Today
- Total
목록전체 글 (346)
혜랑's STORY
시작하며 해킹 분야에서 상대 시스템을 공격하는 것을 익스플로잇(Exploit)이라고 부른다. 시스템해킹의 익스플로잇과 관련된 여러가지 공격 기법 중 첫 번째 공격기법으로 셸코드를 알아볼 것이다. 셸코드(shellcode) 셸코드는 익스플로잇을 위해 제작된 어셈블리 코드 조각을 말한다. 일반적으로 셸을 획득하기 위한 목적으로 사용해 셸코드라고 부른다. 만약 해커가 rop를 자신이 작성한 셸코드로 옮길 수 있으면 해커는 원하는 어셈블리 코드가 실행되게 할 수 있다. 어셈블리어는 기계어와 거의 일대일 대응되므로 사실상 원하는 모든 명령을 CPU에 내릴 수 있게 되는 것이다. 셸코드의 목적에 따라 모두 다르게 작성되나 아키텍처별로 자주 사용되는 셸코드를 모아서 공유하는 사이트도 있다. orw 셸코드 orw 셸코..
Code 실행 main 함수 push rbp 스택에 rbp를 넣는다. mov rbp, rsp rsp의 값을 rbp에 대입한다. mov esi, 0xf esi에 0xf 값을 넣는다. mov rdi, 0x400500 rdi에 0x400500 값을 넣는다. call 0x400497 0x400497에 위치한 write_n 함수를 호출한다. mov eax, 0x0 eax에 0x0 값을 넣는다. pop rbp 스택 최상위 값을 꺼내서 rbp에 대입한다. ret return address로 반환한다. write_n push rbp mov rbp, rsp 스택에 rbp를 넣고 rsp의 값을 rbp에 대입한다. mov QWORD PTR [rbp-0x8], rdi rdi의 값을 [rbp-0x8]의 데이터를 8바이트만큼 참..
Code 실행 1: mov dl, BYTE PTR[rsi+rcx] BYTE PTR[rsi+rcx]의 값을 dl에 대입한다. 2: xor dl, 0x30 dl에 있는 값과 0x30을 xor 연산한다. xor 연산은 비트 연산을 통해 이루어지므로 먼저 두 값을 2진수로 바꿔주고 xor 연산을 한다. 첫 번째 0x400000(0x67)과 xor 연산을 하면 0x57이라는 값을 얻게 된다. 3: mov BYTE PTR[rsi+rcx], dl dl의 값을 BYTE PTR[rsi+rcx]에 대입한다. 4: inc rcx rcx의 값을 1 증가시킨다. 5: cmp rcx, 0x19 rcx의 값과 0x19를 비교한다. 6: jg end 직전에 비교한 두 연산자 중 전자가 더 크면 프로그램을 종료 한다. 7: jmp 1..
x86-64 어셈블리 명령어 Pt.2 Opcode: 스택 x64 아키텍쳐에는 다음 명령어로 스택을 조작할 수 있다. Opcode: 프로시저 컴퓨터 과학에서 프로시저(Procedure)는 특정 기능을 수행하는 코드 조각을 말한다. 프로시저를 사용하면 반복되는 연산을 프로시저 호출로 대체할 수 있어 전체 코드의 길이를 줄일 수 있으며, 기능별로 코드 조작에 이름을 붙일 수 있게 되어 코드의 가독성을 크게 높일 수 있다. 프로시저를 부르는 행위를 호출(Call)이라고 부르며, 프로시저에서 돌아오는 것은 반환(Return)이라고 부른다. 프로시저를 호출할 때는 프로시저를 실행하고 나서 원래의 실행 흐름으로 돌아와야 하므로, call 다음의 멸영어 주소(return address, 반환 주소)를 스택에 저장하고 ..
시작하며 1. 해커들의 언어: 어셈블리 시스템 해커가 가장 기본적으로 습득해야 하는 지식은 컴퓨터 언어와 관한 것이다. 왜냐하면, 컴퓨터의 언어로 작성된 소프트웨어에서 취약점을 발견해야 하기 때문이다. 그런데 컴퓨터의 언어인 기계어는 우리의 일상 언어와 너무나 다르다. 기계어의 경우 0과 1로만 구성돼 있어, 우리가 한 눈에 이해하기 매우 어렵다. 그래서 컴퓨터 과학자 중 한명인 David Wheeler는 EDSAC을 개발하면서 어셈블리 언어(Assembly Language)와 어셈블러(Assembler)라는 것을 고안했다. 어셈블러는 개발자들이 어셈블리어로 코드를 작성하면 컴퓨터가 이해할 수 있는 기계어로 코드를 치환한다. 그런데 소프트웨어를 역분석하는 사람들은 여기에 역발상을 더해, 기계어를 어셈블리..
시작하며 CPU는 실행항 명령어와 명령어 처리에 필요한 데이터를 메모리에서 읽고, Instruction Set Architecture(ISA)에 따라 이를 처리한다. 그리고 연산의 결과를 다시 메모리에 적재한다. 이는 CPU의 동작과 메모리 사이에 밀접한 연관이 있음을 의미한다. 만약 공격자가 메모리를 악의적으로 조작할 수 있다면 조작된 메모리 값에 의해 CPU도 잘못된 동작을 할 수 있다. 이를 메모리가 오염됐다고 표현하며, 이를 유발하는 취약점을 메모리 오염(Memory Corruption) 취약점이라고 부른다. # 리눅스 프로세스의 메모리 구조 1. 세그먼트(Segment) 세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것으로 크게 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트, 힙..
시작하며 컴퓨터는 각자 다른 기능을 수행하는 여러 부품들의 도움으로 작동한다. 이는 컴퓨터에 대한 기본 설계가 존재하기 때문에 가능한 일이다. 이 설계에 맞춰서 여러 하드웨어가 개발되고, 컴퓨터 과학에서는 이러한 설계를 '컴퓨터 구조(Computer Architecture)'라고 부른다. 전체적인 컴퓨터 구조 중 특히 CPU가 사용하는 명령어와 관련된 설계를 '명령어 집합구조(Instruction Set Architecture, ISA)'라고 하는데, 가장 널리 사용되는 ISA 중 하나가 인텔의 x86-64 아키텍처이다. 시스템 해킹 공부를 시작하는 시점에서 앞으로의 학습에 중요한 기초가 될 것이므로 하나 하나 살펴보도록 하자. # 컴퓨터 구조와 명령어 집합 구조 1. 컴퓨터 구조(Computer Arc..
먼저 주어진 파일을 다운받아 코드의 흐름을 살펴보자. hook.c // gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int main(int argc, char *argv[]) { long *ptr; size_t size; initialize(); printf("..