SYSTEM HACKING 7

sysmalloc mmap을 통한 libc leak

sysmalloc_mmap의 코드 일부다. malloc 할 때 일반적으로 큰 사이즈를 요청하면, brk나 sbrk로 program break를 쭉 늘리거나 감당할만하면, 탑 청크에서 떼주는데, malloc(0x200000) 이런 식으로 엄청 크게 줘버리면, 위 sysmalloc_mmap을 통해 mmap syscall을 부른다. 이때 커널에서 리턴받은 메모리와 libc가 로드된 주소와의 오프셋이 일정하다는 특징을 통해 libc leak이 가능하다. libc 바로 앞에 딱 달라붙어있는게 mmap으로 할당받은 곳이다. 임의 크기로 malloc이 가능하고, free를 쓸 수 없어서 릭 벡터가 안 보이면 한 번쯤 생각해볼 만한 트릭인 것 같다.

SYSTEM HACKING 2022.10.04

2022 사이버공격방어대회 CCE 예선 write-ups

Pwnable - UFOrmat communication 함수 안에서 fsb가 터진다. 총 두번 터진다. gift로 덮으면 된다. 첫 번째 fsb는 leak을 하기 위해서 사용했고, 두 번째는 ret를 gift로 덮는 데 사용했다. 그런데 그냥 gift로 덮으면 movaps에서 stack alignment가 깨져서 실행이 안되니까, 함수 프롤로그 과정을 생략한 주소를 넣어줬다. from pwn import * e= ELF('./UFOrmat') libc = ELF('./libc.so.6') #p = process('./UFOrmat',env={"LD_PRELOAD":"./libc.so.6"}) p = remote('3.35.222.217',5333) p.sendlineafter(b'>',b'y') p.s..

SYSTEM HACKING 2022.09.24

EFLAGS OF(Overflow Flag) VS CF(Carry Flag)

CF는 Carry가 일어나면 set되고 OF는 Overflow가 일어나면 set된다고만 알고 있었는데 헷갈려서 찾아보았다. unsigned expression에서의 4-bit 연산을 보자. 1000 + 1000 = 10000은 최상단 비트가 carry된거라서 CF에 해당된다. unsigned expression은 부호 개념이 없어서 Overflow가 의미가 없다. signed expression에서의 4-bit 연산을 보자. 0111 + 0001 = 1000의 경우엔 MSB, 즉 Sign bit가 0에서 1이 되었으니 Overflow를 검출할 수 있고 OF에 해당한다. CPU는 signed인지 unsigned인지 구분이 불가능하니 CF와 OF는 독립적으로 set된다. 1000 + 1000 = 10000 ..

SYSTEM HACKING 2022.07.31

stdin, stdout, stderr bss segment 할당 및 _IO_FILE

1 int setvbuf(FILE *stream, char *buf, int type, size_t size); cs setvbuf 함수이다. FILE 구조체의 포인터, 사용자가 임의로 할당할 버퍼의 주소, 버퍼링 모드, 사이즈를 차례대로 받는다. 1 2 3 4 5 6 #include int main(){ setvbuf(stdout, 0, _IONBF, 0); printf("HI\n"); } cs CTF에서 주로 입력을 안 꼬이도록 하려고 stdin을 _IONBF로 설정하는 경우도 있다. stdout은 기본적으로 line buffering이지만 여기선 일부러 stdout을 setvbuf로 버퍼링 사용을 안 하도록 했다. 그래서 임시 버퍼가 heap에 할당되지 않는다. 명시적으로 stdout을 사용해서 s..

SYSTEM HACKING 2022.07.22

execve 시스템 콜과 쉘 코드 작성 및 추출

execve를 사용해서 쉘 코드를 만들어보겠다. execve 시스템콜이다. rax, rdi, rsi, rdx순서다. 기본적으로 execve를 쓸 때 커널은 filename을 통해서 파일을 열어준다. filename이 /bin/ls의 경우에는 뒤에 argv가 없으면 중단되어서 실행되지 않는다. 하지만 /bin/sh는 argv와 envp에 NULL을 넣어줘도 잘 동작한다. 그 이유에 대해서 찾아봤는데, 아래 글을 발견할 수 있었다. https://stackoverflow.com/questions/36673765/why-can-the-execve-system-call-run-bin-sh-without-any-argv-arguments-but-not Why can the execve system call run..

SYSTEM HACKING 2022.05.24