Pwn

    [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에 대해서는 완전히 생각지도 못하..

    [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..