Pwn/pwnable.xyz

    [pwnable.xyz] words

    문제 풀이 환경 : Ubuntu 20.04 취약한 부분이 어딘지는 알았지만 오프셋 맞추기 귀찮았던 문제... switch의 default를 이용할 생각을 못해 다른 사람 롸업을 좀 봤다. 📝 Analysis > RELRO가 없으니 GOT Overwrite가 가능하다. · main 메뉴별로 선택할 수 있다. fill로 시작하는 메뉴에 들어가면 전역 변수 a를 기준으로 strcpy, strcat을 수행하고 있다. 핵심 메뉴 빼고는 설명하지 않겠다. · save_progress 전역 변수가 널려있는데 bss에 할당된 구조부터 보자. fill_xxx() 함수들에서 strcpy, strcat을 수행한다고 했는데 이를 잘 이용하면 save_progress에서 쓰이는 buf에 담긴 값을 조작할 수 있을 것 같다. (..

    [pwnable.xyz] notebook

    문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > 딱히 특별한 점은 보이지 않는다. · main note 만들기, 수정하기, 삭제하기, 그리고 notebook의 이름 다시 짓기. 이렇게 4가지 기능이 있다. 매번 보던 힙 익스 패턴인가 싶은데 오늘의 주목할 포인트는 거기가 아니다. 4번 메뉴가 이번 익스의 핵심 중 하나다. · readline delimiter이 나올 때까지, 혹은 size 크기만큼 입력을 받는 함수다. 위 주석에도 표시해놓았듯이 OOB, 그중에서도 Off by 1 취약점이 발생한다. 발생하는 조건은 인자로 넘어온 size 크기를 가득 채워서 보냈을 때다. · make_note note를 만드는 함수다. 구조는 아래와 같다. · edit_note ptr 전역 변수에 저장된..

    [pwnable.xyz] nin

    문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > · do_chat 의미 있는 코드는 이 함수에서 시작한다. 여기서 포인트는 __fastcall 어쩌고저쩌고 되어 있는 줄이다. 포인트인 이유는 __fastcall 부분은 어셈으로 봤을 때 특정 부분을 call rax 이런 식으로 부르니 win 함수를 부를 수 있게 하는 가장 쉬운 부분이기 때문이다. 그렇기 때문에 힙 청크의 구조를 잘 살펴보고 익스해보자. · invite_reznor do_chat 함수에서 v0 변수에 값이 없을 때 초기화해주는 함수다. malloc으로 0x20 크기의 청크를 할당한다. 데이터는 [strdup 리턴 청크 주소] [answer_me 주소]의 구조를 가진다. 위의 do_chat 코드를 다시 보면 [answer_..

    [pwnable.xyz] Dirty Turtle

    문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > RELRO, PIE가 없다. · main 이게 다인 프로그램이다. 사용자가 원하는 주소에 원하는 값을 단 하나 넣을 수 있게 하고 프로그램을 종료시킨다. 미티게이션에서 RELRO가 없지만 GOT Overwrite를 사용할 수는 없을 것 같다. 이때 문제에서 준 힌트를 이용할 수 있다. 파이썬 문법으로 결괏값이 DTORS라고 나온다. ▶ What is DTORS? 더보기 https://woosunbi.tistory.com/89 ctors, dtors section GNU Compiler 는 컴파일 시 .ctors, .dtors section 을 생성한다. .ctors 속성의 함수는 main() 전에 실행되고, .dtors 속성의 함수는 ma..

    [pwnable.xyz] Hero Factory

    문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > PIE만 안 걸려있다. · createHero unsigned __int64 createHero() { char *v0; // rax int v1; // eax int size; // [rsp+4h] [rbp-7Ch] char buf[96]; // [rsp+10h] [rbp-70h] BYREF int v5; // [rsp+70h] [rbp-10h] unsigned __int64 v6; // [rsp+78h] [rbp-8h] v6 = __readfsqword(0x28u); memset(buf, 0, sizeof(buf)); v5 = 0; if ( is_hero_setted ) { puts("Br0, you already have a hero..

    [pwnable.xyz] note v2

    문제 풀이 환경 : Ubuntu 16.04 UAF 📝 Analysis > · make_note 이번 문제의 핵심이 되는 함수다. vuln이라고 주석을 달아놓은 곳이 문제인데, malloc을 새로 할당해주려고 하지만 이미 값이 있다면 그냥 그 값을 써버 린다는 점이다. 즉 UAF 취약점이다. malloc과 free에 의한 동작을 정확히 알고 있다면 이번 문제는 쉽다. · delete_note 이 함수는 희한하게 title 부분의 청크는 해제하지 않고 note 내용이 있는 청크만 해제한다. malloc 할당시 title 청크를 조작해줄 수 있는 여지를 제공해준 것이나 마찬가지다. ▶ 나머지 함수는 딱히 필요하지 않다. ✨ Thinking 먼저 할당하는 구조를 살펴보자. free로 아무 청크도 해제하지 않고 ..

    [pwnable.xyz] badayum

    문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > ※ 함수 이름은 제가 임의로 지었습니다. · main 별거 없다. · set_words 저기에 있는 단어 세트들 중에서 랜덤하게 20개를 뽑아서 사이사이에 '-'를 넣고 해당 청크를 리턴해준다. · play set_words 함수에서 받은 청크 내 문자열 길이 + 1만큼 스택에 있는 s 영역에 사용자가 입력할 수 있다. 몇 번 손으로 프로그램을 돌려보면 알겠지만 문자열의 길이가 s 영역의 길이보다 길어질 수 있다는 걸 알 수 있다. 이는 BOF 취약점으로 이어져 미티게이션을 우회해 내가 원하는 주소로 ret을 할 수 있다는 걸 직감할 수 있다. ✨ Thinking 정말 간단하다. canary와 pie_base leak하기, 얻은 결과로 w..

    [pwnable.xyz] password

    문제 풀이 환경 : Ubuntu 16.04 아주 골 때리는.. 아니 게싱 문제다. 📝 Analysis > · main int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int select; // eax int id; // [rsp+0h] [rbp-20h] size_t n; // [rsp+8h] [rbp-18h] BYREF void *s; // [rsp+10h] [rbp-10h] unsigned __int64 v7; // [rsp+18h] [rbp-8h] v7 = __readfsqword(0x28u); setup(); puts("Secure login."); printf("User ID: "); id = (unsign..

    [pwnable.xyz] executioner v2

    문제 풀이 환경 : Ubuntu 16.04 solve_pow가 더 어렵.. 📝 Analysis > 역시나 · main 이전하고 비슷한 모양새를 하고 있지만 단 16Byte만을 입력으로 받을 수 있다. 참고로 초록색으로 하이라이트 된 곳은 어셈블리어로 다음과 같다. 몇 레지스터를 제외하고는 다 0으로 초기화해주고 있다. 이후 rdx에 저장된 주소를 call 한다. · solve_pow 개인적으로 어려워서 고민하다가 다른 사람 롸업보고 푼 부분. (이미 gdb 디버깅을 통해 내가 짠 shellcode의 PoC는 해놓은 상태에서 봤다.) 사실 데이터 형 크기 고정으로 인한 로직 버그라는 건 인지하고 있었지만 계산을 어떻게 할까 고민하고 있었다. 연산 후 범위를 넘어가는 byte에 대해서는 완전히 생각지도 못하..