전체 글 94

포너블 마지막 과제

나는_gosu_다 apk 디컴파일 쳐보니까 jadx로 깔 수 있다고 하길래 jadx로 까봤다. 딱봐도 MainActivity라고 적혀있으니 중요한거 같아서 보면 뭔지는 몰라도, 대충 check_val이 100이면 플래그 출력해주는거라고 충분히 추측할 수 있다. Toast가 뭔지는 몰라도 검색해보면, makeText의 첫번째 이자로 getApplicationContext()를 받고, 그 다음으로 스트링 받고, 마지막으로 길이를 받는다는 것을 알 수 있었다. 그런데 R.string.form1을 보고 들어가봤더니 이상한 주소가 있었다. 잘 찾아보니까 어떻게든 찾을 수 있었다. 그런데, String.valueOf(stringFromJNI())가 있길래, 검색해보니까, C++ native 함수라고 한다. 그래서 ..

포너블 5차시 과제

LIBC base 저기서 libc가 시작하는 주소, 즉 바이너리가 매핑되기 시작하는 부분을 libc base라고 한다. 당연히 다이나믹 링킹에만 해당되는 말이다. 0x00007ffff7dcc00 ~ 0x00007ffff7dee000에 해당한다. 기본적으로 리눅스 커널단에서 ASLR을 지원해서 libc가 매핑된 주소는 계속 바뀐다. 그래서 특정 부분을 가리키기 위해 base를 구한다. 바이너리의 세그먼트들이 그대로 매핑되는 거라서 당연히 libc base를 알면, 특정 부분의 주소도 계산할 수 있다. libc base + offset = address 가 된다. 이를 통해 libc 내부 함수들을 호출할 수 있다. 여기서 offset은 base부터의 떨어진 거리이다. GOT overwrite PLT가 참조하..

포너블 4차시 과제

NX bit : code segment를 제외하고 모두 실행 권한을 빼버리는 보호 기법이다. 원래 스택에 쉘 코드를 삽입하고 instruction pointer를 거기로 옮겨서 쉘을 실행시킬 수 있었는데, Nx 비트가 등장하면서 스택에 실행 권한이 제거되면서 쉘 코드를 사용하기 힘들어졌다. No eXecute라서 NX라고 부른다. plt : procedure linkage table로 execute 권한이 존재한다. 간단한 jmp 문이 존재한다. 여기서 got를 참조해서 libc로 점프한다. Full Relro라서 처음에 dynamic linker가 got도 세팅을 해줘서 여기선 dl autoresolve가 빠져있다. got : global offset table는 심볼에 맞게 libc랑 매칭 해놓은 테..

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

포너블 3차시 과제

Prob0 Full RELRO, PIE와 Canary가 걸려있고 rwx 권한을 가진 세그먼트가 있다. 버퍼 주소를 제공해준다. 나중에 ret 덮을때 사용하면 될 것 같다. _bss_start는 아마 stdout일 것이다. 0x100만큼 입력을 받는다. 근데 버퍼는 88이니까 bof가 터진다. 입력받은 버퍼 다시 출력하니까 canary leak은 널 바이트 덮어서 하면 될 것 같다. 입력을 gets로 다시 받는데, 그건 ret 덮는데 쓰면 된다. canary는 rbp-0x8에 있으니까 0x60 - 0x8 해서 0x58 + 1 덮어주면 된다. 이렇게 해주면 leak이 잘되는 것을 확인할 수 있다. 약간 바꿔서 출력해보면 잘 출력된다. 이제 ret를 shellcode 주소로 덮으면 된다. 이렇게 덮어주면 된다..

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

포너블 2차시 과제

change_ret32 vuln가 보인다. setvbuf로 초기 설정해준다. vuln 함수인데 fgets로 입력받는 것을 볼 수 있다. ebp-0x14니까 0x14만큼 채우고 32비트니까 4 바이트 sfp 더 채워서 0x18 채우면 ret 덮을 수 있다. /bin/sh를 부르는 함수 win이 있다. 그래서 ret를 win으로 바꾸면 eip를 마음대로 바꿀 수 있다. 익스플로잇 코드이다. change_ret64 change_ret32의 x64 버전이다. 코드는 완전 똑같다. 단지 오프셋만 조금 달라졌다. 0x20이다. 정렬 때문에 바뀐 거다. 0x20채우고 sfp 8바이트 채워서 0x28 채우고 win으로 덮으면 된다. 익스플로잇 코드이다. overwrite_ret64 스택의 버퍼 주소를 준다. 그리고 사..

리버싱 11차시 과제

prob-3 v4로 32바이트 받고, init_cpu를 호출한다. init_cpu는 입력받은걸 v5로 복사해준다. 그다음 run_cpu가 호출된다. 이런식으로 opcode에 따라서 명령을 수행하는게 들어가있다. 여기를 조금 눈여겨봐야한다. a1[16]과 a1[17]에 cmp 명령처럼 비교된 결과가 들어간다. 그리고 그 a1에 따라서 분기한다. 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 7..