환경은 ubuntu 16.04 libc-2.23이다. pwnable.tw의 seethefile이라는 문제를 풀다가 좀 궁금해져서 연구하게 됬다. fclose(fp) 를 할 때 파일 포인터가 가르키는 곳을 수정이 가능하다면 leak이 가능하다. 그리고 한가지 신기한점이 flag 조작을 잘하면 fclose가 작동안하게 만들 수 도 있다는점. 실습프로그램이다. stdout으로 진행했다. 일단 미리 magic flag들을 다 적어두었다. #define _IO_MAGIC 0xFBAD0000 /* Magic number */ #define _IO_MAGIC_MASK 0xFFFF0000 #define _IO_USER_BUF 0x0001 /* Don't deallocate buffer on close. */ #defi..
분류 전체보기
하.. 진짜 단순한 바이너리라도 분석을 제대로 안하면 어떤 꼴이 나는지 볼 수 있었던 문제인데.. 일단 바이너리를 보자. void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { __int64 v3; // rax unsigned int v4; // [rsp+Ch] [rbp-4h] initialize(); printf("Name:", a2); read_Str((__int64)&name, 0x20u); v4 = 0; while ( 1 ) { while ( 1 ) { menu(); v3 = read_int(); if ( v3 != 2 ) break; if ( v4 2 ) { if ( v3 == 3 ) { print_name(); } else { ..
환경은 libc 2.29이기 때문에 ubuntu 20.04 에서 실습하였다. heap 문제가 partial relro 이다. 이건 귀하군요... 그리고 푼사람도 점수에 비해 매우 적다. 이 문제를 풀기에 앞서 2.29 이상에서 tcache의 변경점을 간단하게 정리할 필요가 있다. 변경점이라고 해봤자 double free가 안된다는 것이다. size검사 안하는건 똑같다. 2.27에선 아주 좋은 놈이였지만 2.29 이상에서는 해당사이즈의 tcache 전체를 돌면서 검사를 하기 때문에 fastbin 과 같은 double free도 안된다. 그러나 우회 방법이 있다. 1. free 된 청크의 bk를 변조하기 2. 사이즈를 변조하기이다. 3. fastbin 쓰기 4. tcache와 fastbin에 동시에 free..
이 단계에서 라업을 쓸거라고는 별로 생각을 못했는데... 좀 많이 막힌 문제여서 라업작성을 한다. 사실 이런류의 취약점을 처음풀어본다. 그리고 점수에 안맞게 매우매우 어려웠다. 그리고 평소에 라업을 너무 대강쓰는 것 같아서 앞으로 쓰는 틀을 좀 정형화 시켜보려고 노력중이다. 보호기법은 위와 같다. got overwrite이 가능하다! 바이너리를 살펴보자면 크게 add, delete, cart, checkout 으로 나눌 수 있다. Add unsigned int add() { char **cart; // [esp+1Ch] [ebp-2Ch] char nptr; // [esp+26h] [ebp-22h] unsigned int v3; // [esp+3Ch] [ebp-Ch] v3 = __readgsdword(0x..
예기치 못한 종료로 파티션이 손상된 경우가 있는데 , 이경우 이렇게 되는 것 같다. BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash) Enter 'help' for a list of built-in commands. (initramfs)이렇게 되는데 fsck /dev/sda1 를 입력해주고 y를 계속 눌러준후 reboot을 몇번 해주면 고쳐진다. 또는 fsck /dev/sda1 -y 를 해주면 y를 눌려줄 필요가 없어진다
이 문제는 stdin과 stdout의 flag가 로컬과 다르기 때문에 이를 미리 세팅해놓고 푸는게 좋다. 서버의 환경은 stdin 0xfb2887 stdout 0xfbad208b 이다. largin bin attack을 이용해서 풀었다. 취약점은 다들 쉽게 찾을 수 있다. house of orange로 많이들 푸는듯.
요즘은 16.04를 안쓰지만 공부를 하는 입장에서 16.04에서 썼던 잡 테크닉들을 정리 해보려고 한다. (힙이나 스택관련 기법이 아님) 16.04는 오래되서 잘 쓰이지 않지만 시스템 해킹을 입문할 때 많이 사용하고 아직도 많은 CTF 사이트에서 사용하고 있는 운영체제이다. 다른 버전들과 비교했을 때 크게 다른점은 tcache가 없다는 점이다. 또한 vtable 검사도 없다. 주로 이용하는 가젯들은 다음과 같다. 1. 원가젯 너무나도 당연하지만 그냥 넣었다. 2. setcontext+53 rdi만 컨트롤 가능하면 rsp 컨트롤이 가능해 ROP를 할 수 있는 유용한 가젯이다. 문제에서 활용은 __free_hook에 가젯을 넣거나 fake vtable에 이녀석들을 채워서 컨트롤 했던 것 같다. __free_..
바이너리는 이곳에서 받을 수 있습니다. 환경은 Ubuntu 20.04 glibc 2.31이다. 보호기법은 (당연히) 전부 걸려있다. 그렇게 기능이 많지 않은 바이너리인데 그리고 seccomp black list 또한 걸려있다. execve의 호출은 불가능하다. 1. Take a card 단순하게 사이즈를 입력받고 bss영역에 있는 cardSizeTable에 사이즈를 저장하고 malloc으로 입력한 사이즈 만큼 할당을 받는다. ReadInt는 8바이트만큼 문자열을 읽어서 atoi 로 변환해 반환하는 함수이다. (atoll이 아니다!) 2. Edit 취약점이 생기는 부분으로 edit 할 내용을 전역변수에 저장하고, 다시 그 전역변수의 내용을 strcpy로 복사한다. 그러나 전역변수 내용 전체를 memset ..