전체 보기
[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에 담긴 값을 조작할 수 있을 것 같다. (..
[ImaginaryCTF] graphophobia
문제 풀이 환경 : Ubuntu 20.04 📝 Analysis > · main #include #include int password = 0x65706f6e; int main() { setbuf(stdout, NULL); printf("The password is at %p\n\n", &password); puts("What's your name?"); char name[100]; fgets(name, 100, stdin); printf("Hi, "); printf(name); printf("!\n"); if (password == 0x87654321) { puts("Winner!"); FILE* f = fopen("flag.txt", "r"); fscanf(f, "%s", name); fclose(f)..
ImaginaryCTF 소개
ImaginaryCTF라고 디스코드 서버에서 진행되는 wargame이 있다. daily ctf challenge 형식으로 진행되는데 일정 주기로 Round가 진행되고 순위를 매긴다. 초급 ~ 중상급 정도의 문제에 분야도 pwn, reversing, forensic, crypto, steganography, web, misc 등 다양하다. 기초적인 지식과 더불어 해킹 실력의 감을 잃고 싶지 않은 사람들에게 추천한다. https://imaginaryctf.org/
[RaRCTF 2021] write-ups
RaRCTF 2021 > - code 1) main code 전역 변수의 기본값은 0x13371337이다. 그러니까 makeshot() 함수에서 뭔가를 해서 다른 값으로 변경시켜야 할 것 같다. 2) makeshot 저기 빨간 줄은 어셈이 잘못 해석되어있다. code의 주소는 0x404068이다. 그런데 더하는 값이 0x500000라서 scanf에 0x0을 줘도 넘어버린다. 그래서 integer overflow를 이용해서 code의 주소로 맞춰주면 밑에서 0으로 값을 수정해줘서 main의 성공 조건을 통과하고 쉘을 불러올 것이다. 저 값에서 간단하게 64bit로만 맞춰주면 된다. (∵ v1이 64bit로 연산되고 있기 때문) - exploit from pwn import * # p = process('...
[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로 아무 청크도 해제하지 않고 ..