전체 글 314

[Dreamhack CTF] 3-Cipher : Caesar, RSA, AES

23.06.24 Dreamhack CTF Season 3 Round #6 (🌱Div2) 문제이자 나의 첫 암호학 문제! Caesar 암호 평문의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 치환하는 단일 문자 치환 암호 - 알파벳 소문자만 +13 옾셋만큼 밀어서 치환하더라 RSA 암호 1. 배경지식 φ(n)는 오일러 파이 함수로, n 이하의 양의 정수 중 n과 서로소인 수의 개수 2. 키 생성 - 서로 다른 두 소수 p, q를 선택하여 n=p*q로 세팅한다 - 이 때 φ(n) = p*q - p - q + 1 = (p-1)(q-1) 이다 - φ(n)보다 작은 수 중 φ(n)와 서로소인 e를 선택한다 - d ≡ e^(-1) (mod φ(n)) 를 만족하는 적절한 d를 선택한다 => n, e 는 공개키..

security/암호학 2023.06.24

[Dreamhack Wargame] _IO_FILE Arbitrary Address Write

fread() 함수 분석 _IO_file_xsgetn 함수에서 fp->_IO_buf_base 존재하는지 / fp->_IO_buf_end - fp->_IO_buf_base 값이 인자로 전달된 n보다 큰지 검사 _IO_new_file_underflow 함수에서 fp->_flags 존재하는지 / _IO_NO_READS 플래그는 OFF되어있는지 검사 => fp->_fileno, fp->_IO_buf_base , fp->_IO_buf_end - fp->_IO_buf_base 를 인자로 하여 read syscall 호출 문제 소스코드 int main() { FILE *fp; char file_buf[1024]; init(); fp = fopen("/etc/issue", "r"); printf("Data: "); r..

[Dreamhack Wargame] _IO_FILE Arbitrary Address Read

_IO_FILE 구조체 기본 개념 struct _IO_FILE { int _flags;/* High-order word is _IO_MAGIC; rest is flags. */ /* The following pointers correspond to the C++ streambuf protocol. */ char *_IO_read_ptr;/* Current read pointer */ char *_IO_read_end;/* End of get area. */ char *_IO_read_base;/* Start of putback+get area. */ char *_IO_write_base;/* Start of put area. */ char *_IO_write_ptr;/* Current put pointe..

[Dreamhack Wargame] send_sig

IDA를 사용해야됐다는 것 빼고는 진짜 간단한 문제. 문제 조건 ELF 64-bit LSB executable, x86-64, dynamically linked, stripped Partial RELRO No canary found NX enabled No PIE start(), sub_4010B6(), sub_401090(), sub_4010A6() 정도 함수만 보면 됨 문제 분석 void __noreturn start() { setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 1, 0LL); write(1, "++++++++++++++++++Welcome to dreamhack++++++++++++++++++\n", 0x39uLL); write(1, "+ You ..

[Dreamhack Wargame] SigReturn Oriented Programming

SROP 개념 정리 void sig_handler(int signum){ printf("sig_handler called.\n"); exit(0); } int main(){ signal(SIGALRM,sig_handler); alarm(5); ~~ 이런 코드가 존재할 때, SIGALRM 시그널이 발생하면 커널 모드로 진입하여 sig_handler 함수를 실행한다. 이 때 시그널을 커널 모드에서 처리하고나서 다시 유저 모드로 돌아와 프로세스의 코드를 실행해야 하므로, 유저 모드의 상태를 모두 기억하고 되돌아올 수 있도록 한다. 현재 프로세스가 바뀌는 것을 컨텍스트 스위칭 (Context Switching) 이라고 하는데, 커널모드 - 유저모드 간 context 스위칭이 발생할 때의 상황을 커널에서 기억하고..

[Dreamhack Wargame] rtld

rtld = Return To LD file 서버 환경이 ubuntu16.04여서 docker로 가상 환경 구축 시도. Image build 계속 실패하길래 https://stackoverflow.com/questions/24991136/docker-build-could-not-resolve-archive-ubuntu-com-apt-get-fails-to-install-a : 이 사이트 참고해서 해결함 sudo docker build --network=host -t ubuntu1604 . Partial RELRO Canary found NX enabled PIE enabled _IO_2_1_stdout_ 주소를 통해 libc_leak 가능 원하는 주소에 원하는 값을 '딱 한 번' 넣을 수 있음 pie_b..

[Dreamhack Wargame] environ

libc_addr leak 가능하고 임의의 주소의 값을 읽어올 수 있다면 __environ 변수를 이용해 stack address leak이 가능하다 how? 기본적으로 리눅스 바이너리는 스택 주소를 포함하지 않기 때문에 스택 주소를 전역 변수에 저장하는 코드가 있지 않는 한 바이너리 주소 내에서 스택 주소를 찾는 것은 불가능하다 환경 변수에 대한 정보는 스택 영역에 존재하며, 라이브러리 함수를 실행할 때에도 해당 정보를 참조하기 때문에 환경 변수를 가리키는 포인터가 라이브러리 내부에 별도로 선언되어 있다 __environ이라는 이름의 전역 변수 시스템 명령어를 실행하기 위한 execve 계열의 함수와 getenv 등 환경 변수와 관련된 함수에서 참조하는 변수 문제 풀이 Full RELRO Canary ..

[Dreamhack Wargame] Overwrite _rtld_global

코드는 간단하다 stdout@@GLIBC_2.2.5 에 담긴 값을 출력해주고 (= _IO_2_1_stdout_ , 라이브러리에 위치) 원하는 주소에 8 byte를 반복적으로 쓸 수 있다 shell 실행시켜주는 함수는 딱히 보이지 않는다 배경지식 1. 라이브러리와 로더가 맵핑된 주소의 간격은 일정하다. 디버깅을 통해 offset 구해놓을 수 있다 0x7fac45f35000 0x7fac4611c000 r-xp 1e7000 0 /lib/x86_64-linux-gnu/libc-2.27.so ~~~ 0x7fac46326000 0x7fac4634d000 r-xp 27000 0 /lib/x86_64-linux-gnu/ld-2.27.so ~~~ - ld_base - libc_base = 0x3f1000 (원격 서버 환..

[Dreamhack Wargame] master_canary (level2)

level 2이지만 master_canary level 1보다 쉬웠다. 도커파일을 이용해 가상환경을 구현해 옾셋 확인할 수 있었음 서버 환경은 다음과 같다. [취약점] thread_routine에 의해 전역변수 global_buffer 포인터에 thread stack의 버퍼 주소가 저장된다 // thread_routine에서 buf = [rbp-0x110], canary = [rbp-0x8] case 2에서 해당 버퍼의 BOF가 가능하다 case 3에서 leave_comment 버퍼의 BOF가 가능하다, RET overwrite to get_shell 하면 될 듯 // leave_comment = [rbp-0x30], canary = [rbp-0x8] [Exploit Scenario] 1. master_..