목록전체 글 (243)
CIDY
보호되어 있는 글입니다.
이번 주말에 간단하게 했던 CTF다. 시험공부하다가 머리식히는 용으로 해서 막 본격적으로는 못했다. pwn말고도 크립토 포렌식 (엄청쉬운거였지만) 하나씩 더 풀었다. 커널문제 하나 빼고 포넙 셋다 솔브했는데 두번째문제가 리모트에서 타임아웃 + 로되리안 이슈로 말을 안 들어서 (게다가 준 도커파일도 안 돌아감..) 시험공부가 우선이라고 생각해서 접었다. Soulcode 간단한 쉘코딩 문제였다. seccomp이랑 자체 syscall명령어 필터링이 걸려있었는데 우회는 간단했다. 이유는 모르겠는데 메인함수만 디컴파일이 안 돼서 그냥 어셈으로 봤다. 대충 쉘코드 받고 실행시켜주는 내용이다. 그런데 filter랑 install_syscall_filter가 눈에 띈다. filter함수는 이렇게 생겼다. 블랙리스트는 ..
32비트 + 힙문제이다. 요즘 ctf에서 32비트도 힙도 잘 못 본 것 같은데 오랜만에 만난 힙이라 반가웠다. 위와 같이 메뉴 형식으로 돌아가는 전형적인 힙 문제의 구조였다. 취약점이 너무 분명하게 있고, 할당-해제를 꼬아 풀면 되는 문제라서 코드 하나하나를 자세히 읽지는 않았던 것 같다. 우선 취약점이다. 할당할때는 512로 할당하는데 수정할때는 528을 입력받는다. (심지어 할당 크기 max도 512인데, 528을 입력받는다.) comment(b"AAAA") comment(b"BBBB") comment(b"CCCC") comment(b"D" * 0x1ff + b"X") comment(b"EEEE") view() io.recvuntil(b"X") heap = u32(io.recvn(4)) print(h..
리눅스는 모든 것을 파일로 관리한다. proc파일 시스템은 운영체제의 각종 정보를 커널 모드가 아닌 유저 모드에서 쉽게 접근할 수 있도록 해준다. (proc은 process를 의미한다.) 이 파일 시스템은 시스템이 부팅될 때 커널이 메모리상에 만들어 둔 가상 파일시스템으로, 디스크에는 존재하지 않는다. 프로세스에 대한 다양한 정보를 제공해준다. (프로세스 정보뿐만 아니라 다른 시스템 정보들까지 광범위하게 제공해준다.) 다음은 proc디렉토리의 일부 파일에 대한 설명이다. /proc/1 프로세스 번호 1번에 대한 정보가 있는 디렉토리이다. 각 프로세스는 자신만의 디렉토리를 /proc하위에 갖는다. 자신의 프로세스 식별 번호(process identification number)가 그 디렉토리의 이름이 된다..
task 리눅스의 태스크는 프로그램 실행 단위를 말한다. 사용자가 어떤 프로그램을 실행하면 태스크가 생성되고, 그 프로그램의 코드가 실행된다. 리눅스에서는 하나의 프로세스와 스레드가 각각의 태스크가 된다. 대부분 운영체제는 여러 태스크를 생성해두고, 각 태스크에 실행 시간을 배분하는 방식으로 태스크를 관리한다. 다수의 태스크를 관리하는것을 멀티 태스킹(Multitasking), 실행 시간을 배분하는 것을 스케줄링(Scheduling)이라고 한다. 각 태스크는 커널 메모리에 task_struct구조체로 표현되는데, 이 구조체에는 태스크의 여러 정보가 저장되어 있다. 그 중에는 사용자 신원, 권한에 대한 정보도 포함되어 있어서, 이를 조작하는 것이 커널 익스플로잇의 목표가 되기도 한다. 리눅스 권한 리눅스는..
포너블에서 이용되는 linux exploitation에는 다양한 기법이 존재하겠지만.. 복습 겸 조금 생소한? 것들만 가볍게 정리하고 넘어가겠다. .init_array & .fini_array 위와 같이 gdb에서 elfheader명령어를 수행하면 바이너리에 존재하는 여러 섹션들을 볼 수 있다. 이러한 섹션들은 소스코드가 빌드될 때 컴파일러에 의해 만들어지는데, .init_array와 .fini_array는 바이너리가 실행되고 종료될 때 참조하는 함수 포인터들이 저장되어 있는 섹션이다. void usercall noreturn start(__int64 a1@, void (*a2)(void)@) { ... __libc_start_main(main, v2, &_0, _libc_csu_init, _libc_c..
프로그램의 취약점에는 크게 두 가지가 있다. 1) 메모리 커럽션, 2) 로지컬 버그. 메모리 커럽션이 프로그램 자체의 메모리 관리 실수로 인해 발생하는 취약점인 반면, 로지컬 버그는 프로그램상의 논리적 오류로 인해 발생한다. 로지컬 버그의 경우 프로그램의 부정확한 동작을 초래하지만 크래쉬를 일으키지는 않는다. 프로그램을 구현할 때 음수나 범위를 넘은 인덱스 등에 대해 예외처리를 해 주지 않아 발생하는 오류 등이 대표적인 로지컬 버그이다. Command Injection 인젝션은 사용자의 입력을 검증하지 않고 쉘 커멘드나 쿼리의 일부로 처리하여 공격자로 하여금 실행 흐름을 조작할 수 있도록 하는 취약점이다. 쉘에서 존재하는 다양한 메타문자들을 이용해 커맨드 인젝션을 트리거할 수 있다. $ : 쉘 환경변수 ..
지난 주말에 했던 ctf인데, 물론 포너블만 풀었다. 동아리 팀에는 포너블 잘하시는 분들이 너무 많이 계셔서 앞으로는 솔플을 하면서 실력을 좀 다져야 겠다는 생각이 든다.. 총체적으로 문제 수준이 별로기는 했는데.. 그래도 더 삽질해보고 잡아보고 올솔브하고싶었는데 이래저래 할 일도 있고 해서 7/10 해버렸다. 쩝.. Inspector Gadget main함수 pwnme함수 mitigation 그냥 pwnme에서 오버플로우 넉넉히 주니 rop하라는 문제다. from pwn import * #p = process("./inspector-gadget") #e = ELF("./inspector-gadget") #libc = e.libc libc = ELF("./libc.so.6") p = remote("tam..