Pwn/pwnable.xyz

    [pwnable.xyz] executioner

    문제 풀이 환경 : Ubuntu 16.04 간단한 쉘코딩 문제다. 📝 Analysis > 역시 풀밭이다. · main 처음에 solve_pow라는 함수를 부르고 이후 key 전역 변수를 랜덤한 값으로 꽉 채운다. 그리고 이 값을 가지고 사용자가 입력과 xor한다. mmap을 통해 실행 권한을 가진 영역에 결괏값을 저장하고 실행한다(jmp rax). · solve_pow 뭔가 특별해 보이지만 그냥 단순한 문제풀이에 둘 중 하나의 값은 얻은 값, 다른 하나는 0으로 주면 기다리지 않고 그냥 끝난다... ✨ Thinking 입력값과 xor 될 key 값을 조작할 방법이 없어 보이지만 pwnable.xyz에서 나온 다른 여타 문제처럼 strlen 함수가 말썽이다. 만약 내가 첫 바이트를 null로 준다면 xor..

    [pwnable.xyz] catalog

    문제 풀이 환경 : Ubuntu 16.04 (간단한 평, 안 적어도 무방) 📝 Analysis > · main 누가 봐도 3번 메뉴에서 부르는 함수의 포인터를 조작해서 호출해주는 게 목표다. 그렇다면 이용할 수 있는 건 write_name, edit_name 함수라고 판단되며, 살펴보자. · write_name 0x30 크기의 chunk를 할당하고 그 안에서 사용자가 이름을 입력하게 한다. 입력 크기는 처음 만들 당시에는 하드 코딩된 사이즈인 0x20만큼 입력하고 edit_name 함수로 저장한다. 이후 사용자가 입력한 크기를 다시 조사하여 그 크기를 저장한다. · edit_name 전달받은 포인터에서 안에 저장된 크기만큼 입력한다. ✨ Thinking edit_name 함수에서 name size에 저장..

    [pwnable.xyz] bookmark

    문제 풀이 환경 : Ubuntu 16.04 간단한 문제다. 📝 Analysis > 난 풀밭이 싫다. · main check 전역 변수의 값이 0이 아니라면 win 함수를 호출하니 여기를 부를 수 있도록 하면 된다. 조작할 수 있는 공격 벡터가 존재하는 곳은 딱 봐도 2번 메뉴밖에 없어 보인다. · create_rul bm에 처음 프로토콜 종류를 입력하고 secure인지 판단하고 그다음 character부터 ': or /'가 안 나올 때까지 뒤로 간다. 그렇게 그 부분을 찾은 다음에 사용자가 제한된 크기 안에서 입력하고 싶은 값을 입력하고 bm부터 훑었을 때 가장 처음 null byte가 나오는 곳부터 입력한 값을 붙여준다. ✨ Thinking 현재 bss 구조다. 이 부분의 로직 에러를 이용해서 계속 뒤..

    [pwnable.xyz] rwsr

    문제 풀이 환경 : Ubuntu 18.04 임의의 읽기, 쓰기가 주어졌을 때 뭘 타깃으로 할 거냐고 묻고 있다. 📝 Analysis > · main 메뉴 0: return 부르고 종료한다. 메뉴 1: 임의의 주소 읽기 (read) 메뉴 2: 임의의 주소 쓰기 (write) ✨ Thinking 메뉴 1, 2가 있는 것만으로도 세상을 다 가진 기분으로 익스를 할 수 있다. 미티게이션을 확인해보면 PIE 빼고 다 걸려있다. 즉 got overwirte로는 간단히 끝낼 수 없다는 뜻이다. 그래서 메뉴 0번이 눈에 띄었다. main 함수의 ret 부분을 win 함수로 덮어주고 메뉴 0번을 호출한다면 끝날 것 같았다. 그렇다면 어떻게 그 주소를 leak 할 수 있을까 생각해보면 우리에게는 environ 포인터가 있..

    [pwnable.xyz] fclose

    문제 풀이 환경 : Ubuntu 16.04 문제 이름만 봐도 FSOP(File Stream Oriented Programming)이란 걸 알려주고 있고, 문제 설명에서는 어떤 버전의 _IO_FILE 구조체를 쓰는지도 알려주고 었다. (libc-2.23 -> Ubuntu 16.04) 📝 Analysis · main 매우 심플하다. 딱 보기에 입력할 수 있는 크기도 커서 내가 직접 _IO_FILE_plus 구조체를 작성해서 FSOP을 해보라는 의도의 코드다. >> file 관련 구조체는 어떻게 생겼지?? 더보기 1. _IO_FILE 구조체 https://elixir.bootlin.com/glibc/glibc-2.23/source/libio/libio.h#L241 2. _IO_FILE_plus 구조체 http..

    [pwnable.xyz] messag

    문제 풀이 환경 : Ubuntu 16.04 📝 Analysis > 풀밭이다. · main ※ scanf도 null byte를 읽을 수 있다는 점을 까먹지 말자. 메뉴 1번을 통해 메시지를 수정할 수 있다. 내가 원하는 페이로드를 여기로 넣으면 될 것 같다. 메뉴 3번은 이 문제에서 bss영역에 있는 admin 변수 값을 건드리기 조--금 어렵기 때문에 BOF with canary를 생각했다. 메뉴 2번으로 OOB를 통해 canary를 leak 할 수도 있지 않을까 싶었지만 디버깅해보면 scanf 입력 끝에는 null을 삽입해서 불가능했다. 메뉴 0번! 있는지 잘 안보이지만 이걸로 함수를 종료하고 ret을 호출할 수 있다. 물론 canary를 검사한 뒤다. · get_choice get_choice 함수에..

    [pwnable.xyz] UAF

    문제 풀이 환경 : Ubuntu 16.04 낚였다. 별거 없는 문제다. 📝 Analysis > · edit_char 핵심 함수인데 문제 이름 때문에 다른 데에서 헤맬 수 있다. strchrnul 함수가 오늘의 주인공이다. 이 함수의 기능은?? 더보기 https://gawoori.net/strrchr-3-linux-%EB%A7%A4%EB%89%B4%EC%96%BC-%ED%8E%98%EC%9D%B4%EC%A7%80/ 요약: 찾는 문자가 없으면 문자열의 제일 끝을 리턴한다. ✨ Thinking 처음에는 문제 이름 때문에 힙 문제인줄 알고 열심히 분석하다가 문득 떠오른게 edit 함수 기능 이용하면 뒤로 다 덮을 수 있겠네? 싶어서 바로 해봤다. 제대로 낚였다. ㅋㅋ 🧩 Exploit Scenario 1. sa..

    [pwnable.xyz] strcat

    문제 풀이 환경 : Ubuntu 16.04 처음에 길을 잘못 들 뻔했는데 다행히도 잘 해결했다. 📝 Analysis > 대충 name을 strcat 해주는 프로그램이다. · main 메뉴에 따라 기능이 실행되는 모양을 하고 있다. 1번 메뉴: strcat의 기능을 구현해놓은 것처럼 보인다. 2번 메뉴: desc 전역 변수에 설정된 주소를 참조해서 값을 수정할 수 있다. 왠지 전역 변수인 만큼 값 변경 후 수정을 해주면 될 것 같은 기분이 든다. 3번 메뉴: FSB(Format String Bug) 해보세요! 라고 어필하고 있지만 함정에 걸리지 말자. 더 간단한 방법이 있다. · read_int32 이 함수는 기본적으로 메뉴의 기능을 선택하기 위해 존재한다. 처음에는 malloc, free의 존재와 mai..

    [pwnable.xyz] J-U-M-P

    문제 풀이 환경 : Ubuntu 16.04 생각보다 간단했던 문제다. 📝 Analysis > Canary를 제외하고는 초록초록하다. 3번 메뉴는 뭔갈 leak 해주고, 1번은 Segmentation fault가 뜬다. · main 초기 세팅을 살펴보면, 미티게이션에서 canary 없었던 이유가 나만의 canary 만들기 때문이라는 걸 유추할 수 있다. v6(rbp - 0x8)에는 PIE offset + 0xba0 값을 먼저 저장해준다. 메뉴별 기능을 살펴보자. 메뉴 number 기능 1 v5(rbp - 0x10)에 저장한 나만의 canary 값이 전역 변수 canary 값과 같을 때 v6의 값을 주소로 call을 해준다. (어셈블리어로 보면 그렇다.) 2 v6의 하위 4Byte와 select를 xor 해..