일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- fastapi를 사용한 파이썬 웹 개발
- Dreamhack
- BOF
- PCA
- ARM
- bloc
- rao
- ML
- Image Processing
- 백준
- BFS
- Algorithm
- DART
- BAEKJOON
- system hacking
- MATLAB
- C++
- FastAPI
- Kaggle
- pytorch
- Got
- Flutter
- llm을 활용 단어장 앱 개발일지
- study book
- Computer Architecture
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- MDP
- Stream
- Widget
- 영상처리
- Today
- Total
목록Computer Science/System Hacking (10)
Bull
r gdb 실행 시 r 혹은 ni 같이 명령어 이후에 문자열을 넣을 수 있다. 하지만 \x00처럼 널바이트는 무시되어 들어간다..그래서 원하는 위치에 바이트코드는 들어가지만 널바이트가 들어가는 곳은 형태가 그대로 유지된다. 이것에 대한 해결방법은 시간이 되면 찾아볼 예정.

got에 대해서 알고 있었지만 plt는 사실 잘 모르고 있었다. python에서 pwntools을 쓰던 중 lib 동적링킹된 함수랑 실행파일에서 실행하는 함수랑 무슨 차이가 있는 건지 명확하게 나눠지지가 않아서 다시 공부했다. dreamhack 학습자료와 여러 블로그 자료를 보면서 한 지식으로 수렴했다.gdb로 보는 것 보다 ida로 보는 게 편했다. 이론적인 건 다른 블로그나 드림핵에서 잘 설명했으니 동작만 간단하게 설명한다.Codee = ELF('./validator_revenge')libc = ELF('./libc-2.27.so')read_got = e.got['read']read_plt = e.plt['read']read_libc_symbols = libc.symbols['read']print(f..

FSB C언어에 포맷 스트링이라하면 대표적으로 printf, scanf, fprintf, fscanf, sprintf, sscanf가 있다. 이 함수들은 포맷 스트링을 채울 값들을 레지스터나 스택에서 가져온다. 그런데 이들 내부에는 포맷 스트링이 필요로 하는 인자의 개수와 함수에 전달된 인자의 개수를 비교하는 루틴이 없다. 그래서 만약 사용자가 포맷 스트링을 입력할 수 있다면, 악의적으로 다수의 인자를 요청하여 레지스터나 스택의 값을 읽을 수 있다. Printf() https://cplusplus.com/reference/cstdio/printf/ https://cplusplus.com/reference/cstdio/printf/ function printf int printf ( const char *..

개념 Return To Library(RTL)는 NX를 우회하는 공격 기법으로 널리 알려져있다. NX로 인해 공격자가 버퍼에 주입한 셸 코드를 실행하기는 어렵지만, 스택 버퍼 오버플로우 취약점으로 반환 주소를 덮는 것은 여전히 가능하다. 프로세스에 실행 권한이 있는 메모리 영역은 일반적으로 바이너리의 코드 영역과 바이너리가 참조하는 라이브러리의 코드 영역이다. Return-to-Libc: 공격자는 특정 libc 함수의 주소를 리턴 주소로 설정합니다. 가장 일반적인 목표는 system 함수로의 실행 흐름을 변경하는 것이며, 이를 통해 임의의 시스템 명령을 실행할 수 있다. 예를 들어, 공격자는 system("/bin/sh") 호출을 통해 셸을 획득할 수 있다. Dreamhack 실습코드 // Name: r..

시스템 해킹과 보안 분야에서 "PLT(Procedure Linkage Table)"와 "GOT(Global Offset Table)"는 주로 동적 링킹을 지원하는 시스템에서 사용되며, 실행 시간에 함수와 변수의 실제 주소를 결정하는 역할을 한다. 여기서 동적 링킹이란 프로그램이 실행되는 동안 필요한 코드나 데이터를 다른 파일로부터 불러와 연결하는 과정이다. PLT(Procedure Linkage Table) PLT는 동적 링킹을 사용하는 프로그램이 외부 함수를 호출할 때 사용하는 테이블이다. 예를 들어, 어떤 프로그램이 C 라이브러리의 printf 함수를 호출하려 할 때, 해당 프로그램의 실행 파일 자체에는 printf의 실제 코드가 포함되어 있지 않다. 대신, 실행 시간에 동적 링커(dynamic li..

NX (No eXecute) NX는 실행 금지 비트라고도 하며, 특정 메모리 영역에 실행 권한을 부여하지 않아 공격자가 악의적인 코드를 그 영역에 삽입하고 실행하는 것을 방지하는 기술이다. 스택이나 힙과 같이 데이터를 저장하는 용도로 사용되는 메모리 영역에서 코드 실행을 금지하여, 버퍼 오버플로우 공격을 통한 악성 코드 실행을 막는다. 위 사진과 같이 vmmap을 통해 어느 스택 주소에 실행권한이 있는지 없는지 판별할 수 있다. NX의 또다른 명칭 인텔 AMD ARM 윈도우 XD(eXecute Disable) NX DEP(Data Execution Prevention XN(eXecute Never 명칭만 다를 뿐 모두 비슷한 보호 기법이다. 5.4.0 미만 버전 스택 영역 뿐만 아니라 힙, 데이터 영역 ..

Stack Cnanary란? Stack Canary는 스택 버퍼 오버플로우 공격을 탐지하고 방지하기 위해 사용된다. 이 기술은 '카나리아'라는 새에 비유되는데, 과거에 광부들이 가스 누출을 감지하기 위해 새를 채굴장에 가져갔던 것에서 유래한다. 마찬가지로, 스택 카나리는 메모리의 특정 부분에 의도적으로 배치된, 변경되면 안 되는 값(카나리 값)으로, 스택 버퍼의 오버플로우를 감지하는 데 사용된다. 프로그램이 실행될 때, 스택 카나리 값은 스택에 있는 로컬 변수와 반환 주소 사이에 배치된다. 이 값은 실행 동안 불변이어야 하며, 보통 실행 때마다 또는 프로그램이 시작될 때마다 무작위로 생성된다. 공격자가 버퍼 오버플로우를 이용하여 스택의 메모리를 덮어쓰려고 시도할 때, 카나리 값도 변경될 가능성이 높다. ..

Return Address Overwrite Return Address Overwrite는 공격자가 프로그램의 실행 흐름을 조작하기 위해 사용하는 기법 중 하나이다. 이 기법은 주로 버퍼 오버플로우 취약점을 이용하여 실행된다. 버퍼 오버플로우란 프로그램이 데이터를 저장하기 위해 할당받은 메모리 영역(버퍼)을 초과하여 데이터를 쓸 때 발생하는 보안 취약점을 말한다. char buf[0x30]; scanf("%s", buf); buf에 0x28만큼 스택에 할당되었다고 하자. 그런데 scanf는 크기를 얼마나 받을 지 정해놓지 않았기때문에 buf에 0x30보다 많이 넣으면 오버플로우가 일어난다. 이렇게 인덱스의 값이 배열의 크기보다 커지는 현상을 Index Out Of Bound (OOB)라고 하며 OOB취약..

Shell Code란? 셸코드(Shellcode)는 공격자가 취약한 소프트웨어를 이용해 임의의 코드를 실행하기 위해 사용하는 바이트 코드이다. "셸"이라는 용어는 이 코드가 종종 공격자에게 시스템의 셸에 접근을 제공하기 때문에 붙여졌다. 즉, 공격자는 셸코드를 사용해 시스템에 명령을 내릴 수 있는 권한을 얻는다. 셸코드는 다음과 같이 나타낼 수 있다. \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 실행파일에서 호출할 수 있는 부분을 조작할 수 있다면 임의의 셸코드를 넣어서 공격할 수 있다. 셸코드를 직접 만들기 전 프로그램이 어떻게 돌아가는 지 알아 볼 것이다. sysca..

pwntools란? 드림핵에서 시스템해킹 트랙을 하기에 필수적인 파이썬 툴이다. 드림핵 뿐만 아니라 일반적으로 포너블에서 쉘을 따기위해 필요한 도구이다. 함수정리 remote() r = remote("localhost", 8888) 원격주소에 nc 명령어 역할을 해준다. process() p = process("./실행파일") 실행파일을 연결해준다. recv() r = remote("localhost", 8888) m = r.recv() m = r.recv(10) # 10byte 만큼 받아온다. receive의 단축말이다. 연결된 대상에서 데이터를 받는다. recvline() r = remote("localhost", 8888) m = r.recvline() 연결된 대상에서 \n 까지 받는다. 즉 한 줄..