PIE 에 대해서 얘기 하기 전에 PIC 에 대한 이해가 선행될 필요가 있다. What is PIC? Position Independent Code : PIC 위치 독립 코드 이 자체로는 보호 기술은 아니나 PIE를 이해하기 위해서 필요하다. PIC는 공유 라이브러리에 적용되는 옵션으로 공유 라이브러리 내 심볼들이 어느 주소에 로드되더라도 동작하는 코드이다. 주 기억 장치의 어딘가에 배치되어 절대 주소와 관계없이 모든 메모리 주소에서 수정없이 실행되는 기계 코드이다. 일반적으로 공유 라이브러리에서 사용되며, 동일한 라이브러리 코드는 각 프로그램의 메모리 영역에 로드 된다. 각 프로세서들은 PIC를 서로 다른 주소에서 실행할 수 있으며, 실행 시 재배치가 필요 없다. 공유 라이브러리를 만들 때 -fPIC ..
전체 글
늦은 감이 있지만 이제서야 올리는 청소년 정보보호 페스티벌 운영 후기 8월 11일에 YISF 예선을 했다. 대회 시간은 총 36시간이였고 운영진들은 서버실에 갇혀서 모니터링 했다. 서버는 미리 세팅하고 컨테이너만 켜주면 되는 상태라서 여유로웠다. 대회 중에는 생각보다 여유로웠다. 상문제를 출제해서 그런가 질문이 많이 오지 않았다. 그래서 그냥 할거 하고 놀았다. 나는 Pwnable 분야의 dobby’s diary, conquer(본선 문제였는데 가제가 힌트를 너무 많이 줘서 당일날 선배의 아이디어에 따라서 바꿨다. 근데 이게 맞는지 모르겠음) 문제를 출제했다. dobby's diary 문제는 0솔버가 나왔는데 이번에 1등하신 sechack 님이 그 트릭은 아니겠지 하고 더 쉬운 방법 찾다가 못푸셨다고 한..
SROP 는 sigreturn 시스템 콜을 이용하여 레지스터에 원하는 값을 저장할 수 있다. 해당 기법을 이용하여 원하는 시스템 함수를 호출할 수 있다. Signal signal은 프로세스에게 이벤트가 발생했음을 알린다. signal은 다른 프로세스에게 시그널을 전송 할 수 있다. signal은 원시적인 형태의 IPC(interprocess communication) 로 사용 할 수 있다. signal은 자기 자신에게 시그널을 보낼수도 있다. signal은 일반적으로 커널이 송신하며, 다음과 같은 이벤트 종류가 있다. 하드웨어 예외가 발생한 경우 사용자가 시그널을 발생시키는 터미널 특수 문자 중 하나를 입력한 경우 Interrupt character ( Control + c) Suspend charact..
실행 바이너리를 실행하면 정수를 입력할 수 있고 여기서 integer overflow 가 발생한다. 그 이후에 comment 를 입력할 수 있는데 그냥 일반적인 입력에서는 ret 를 조작할 수 없다. 그래서 -2147483648 를 입력해주면 이후 comment 를 입력하는 부분에서 sub 1 을 해줘서 양수로 바뀐다. 이후는 그냥 rop 하면 된다. gef➤ disass main Dump of assembler code for function main: 0x00000000004012ad :endbr64 0x00000000004012b1 :push rbp 0x00000000004012b2 :mov rbp,rsp 0x00000000004012b5 :sub rsp,0x70 0x00000000004012b9 ..
rtl, rtl chaining, rop 는 거의 비슷하다. chaining 되는 함수의 종류에 따라 다른 것. What is RTL Chaining system(”/bin/sh”)을 호출하는 것이 최종 목표라면 system(”/bin/sh”)을 호출하기 위해 system과 “/bin/sh”가 필요함 RTL에서는 system과 “/bin/sh”을 정적으로 찾았지만 system과 “/bin/sh”을 모를 경우 “/bin/sh”을 프로그램이 싫애되는 동안 적어주고 system의 주소를 알아내야한다. 이때는 한번의 RTL로 쉘을 따기 힘들기 때문에 RTL을 연계하여 프로그램을 지속적으로 흐르게 해야한다. x86 rtl RTL에서 ret부분에 다음 함수의 주소를 넣어주면 된다. 하지만 pop ret; 과 같은 ..
One Gadget 이란 해당 Gadget 하나만을 이용하여 Shell 을 획득 할 수 있는 Gadget One Gadget은 라이브러리 파일 내에서 “/bin/sh”을 실행하는 Gadget이다. One Gadget을 사용하기 위해서 일부 조건이 만족해야 되는 경우가 있다. 직접 찾기 lmxx@lmxx:~/workplace/adult_canary$ strings -tx libc.2.31.so.6 |grep /bin/sh 1b75aa /bin/sh lmxx@lmxx:~/workplace/adult_canary$ objdump -M intel -d libc.2.31.so.6 | grep -C8 1b75aa 54f90:66 48 0f 6e c1 movq xmm0,rcx 54f95:48 8d 7c 24 0c l..
[TOOR] 8,10 공유 라이브러리 & Lazy Binding & Now Binding What is GOT overwrite //gcc -o test test.c -z execstack -fno-stack-protector -m32 no-pie #include int main()} printf("/bin/sh"); } in gdb plt주소를 알아낸 후 got주소를 확인 원하는 라이브러리 함수의 주소를 알아내고 got주소를 아래 명령어를 통해서 변경 set *got주소 = 바꿀 주소 쉘이 실행되는 것을 확인할 수 있다. 이 글은 옵시디언을 이용해서 작성되었습니다.
Full Code #include #include #include #include #include #include #define INSN_ENDBR64 (0xF30F1EFA) /* endbr64 */ #define CFI(f) \ ({ \ if (__builtin_bswap32(*(uint32_t*)(f)) != INSN_ENDBR64) \ __builtin_trap(); \ (f); \ }) #define KEY_SIZE 0x20 typedef struct { char key[KEY_SIZE]; char buf[KEY_SIZE]; const char *error; int status; void (*throw)(int, const char*, ...); } ctx_t; void read_member(ct..