목록분류 전체보기 (101)
ipwn
이번에 정리해볼 기법은 house of force기법이다. free고 뭐고 필요 없어서 내가 이해하기 쉬웠다. 이 기법은 간단하게 정리하면 top chunk를 건들여서 size를 무한정 입력받을 수 있게 해주는 기법이다. 이 기법을 이용해서 스택까지의 offset을 구해서 ret을 변조해서 eip를 어떻게 할 수도 있고, 아마 보통은 got overwrite를 하는데 쓰이지 않을까 하는 생각이 든다. 일단 바로 예제 코드를 컴파일하고 어떻게 작동하는 건지 원리 설명을 차근차근 해보겠다. #include #include #include void make_system(){ system("echo this func just gadget");} int main(int argc, char *argv[]){ cha..
떤 CTF인지는 잘 모르겠고 친구가 못풀겠다고 해서 한 번 풀어봤다.(etc로 카테고리를 넘긴 건 그냥 뭔 ctf인지 몰라서이다.) 이번 문제는 greeting문제였는데, 그냥 fsb 문제였던 것 같다? 아마도 일단 바로 분석해보겠다. int __cdecl main(int argc, const char **argv, const char **envp){ char s; // [esp+1Ch] [ebp-84h] char v5; // [esp+5Ch] [ebp-44h] unsigned int v6; // [esp+9Ch] [ebp-4h] v6 = __readgsdword(0x14u); printf("Please tell me your name... "); if ( !getnline(&v5, 0x40) ) ret..
흠 지금 생각해보니 디미고 신입생 대상으로 한 CTF인데 10위권 안에 못들다니 ㅜㅜ 위에 사람들이 전부 외부인이라지만 못 풀만한 수준의 문제들이 있다는 것 자체가 내 수준이 심각하다는 걸 의미할 것 같다. 그래 암튼 라업이나 쓰자. 이 문제도 생각보다 쉽게 풀렸다. int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ int v3; // eax start_init(); while ( 1 ) { while ( 1 ) { menu(*(_QWORD *)&argc); v3 = scan_int(); if ( v3 != 2 ) break; Free(*(_QWORD *)&argc); } if ( v3 > 2 ) { if ( v3 =..
int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); while ( 1 ) { puts("welcome to the Coder world!\n"); puts("1.fight"); puts("2.shop"); puts("3.trainning"); puts("4.exit"); __isoc99_scanf("%d", &cho); switch ( cho ) { case 1: fight(); break; case 2: shop(); break; case 3: trainning(); break; default: puts("defalt input..
이번에 푼 문제는 bugbug이다. 오랜만에 ctf문제 exploit해서 기분 좋다. 암튼 바로 시작하겠다. 후 쓰다보니 라업 쓰는게 문제 푸는 것 보다 더 어렵다. NX가 걸려있고 나머지는 아무것도 걸려있지 않다. 이제 ida로 까보자. int __cdecl main(){ unsigned int v0; // eax unsigned int v1; // eax int result; // eax int v3[6]; // [esp+4h] [ebp-A4h] int v4[6]; // [esp+1Ch] [ebp-8Ch] char buf; // [esp+34h] [ebp-74h] unsigned int ptr; // [esp+98h] [ebp-10h] FILE *stream; // [esp+9Ch] [ebp-Ch] ..
이번에 쓸 라업은 input문제이다. 보아하니 여러가지 input을 받는 방법에 대해서 알고 있느냐를 물어보는 듯 하다. 바로 소스코드를 보도록 하겠다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv[..
정말 오랜만에 블로그 글을 쓴다. 아무튼 이번에 풀 문제는 coin1문제이다. 흠 그렇다 굉장히 간단한 문제이다. 왜 이제 라업을 쓰는지는 나도 잘 모르겠다. 처음 시작화면인데 게임 룰을 설명해준다.다들 사진만 보면 이해할 것 같지만 간단히 설명하자면처음에 총 코인 갯수와 도전할 수 있는 횟수를 정해주고, 도전할 수 있는 횟수만큼 내가 계속 코인을 부를 수 있다.그래서 10의 무게를 갖고있는 코인들 중 9의 무게를 갖는 가짜 코인을 찾아내면 된다. 그러니까 C번의 기회안에 N개의 코인 중 1개의 가짜코인을 찾아내면 된다는 말이다. 음.. 새벽이라 그런지 설명을 잘 못하는 것 같다. 나중에 덧붙여야지 암튼 게임을 시작해보겠다. 한 번만 찾으면 끝나고 플래그 주는 줄 알았는데 아니었다. 설명 다시 읽어보면 ..
이번에 작성할 Writeup은 코게 2018에 나온 BaskinRobins31이다. 그냥 되게 간단히 풀리는 문제였다. 64bit이며, NX가 걸려있다. int __cdecl main(int argc, const char **argv, const char **envp){ unsigned int v3; // eax unsigned int v5; // [rsp+8h] [rbp-8h] _BOOL4 v6; // [rsp+Ch] [rbp-4h] setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 2, 0LL); v3 = time(0LL); srand(v3); v5 = 31; v6 = 0; puts("### This game is similar to the BaskinRobin..
이번엔 pwn5문제다. static linked 컴파일 되어있고 nx가 걸려있다. 휴 733kb이길래 갑자기 왜 이렇게 함수가 많아진거지 했는데, 그냥 스태틱 링킹 방식으로 컴파일 한거였다.바로 풀러 가보자. int __cdecl main(int argc, const char **argv, const char **envp){ print_beginning(); return 0;} print_beginning함수를 호출해준다. int print_beginning(){ int result; // eax char v1; // [esp+Fh] [ebp-9h] puts("Welcome to the TAMU Text Adventure!"); puts("You are about to begin your journey ..
이번에 푼 문제는 pwn4이다. 바로 ida로 까보겠다. int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ setvbuf(_bss_start, (char *)2, 0, 0); while ( 1 ) reduced_shell();} reduced_shell함수를 호출한다. int reduced_shell(){ char s; // [esp+Ch] [ebp-1Ch] puts("I am a reduced online shell"); puts("Your options are:"); puts("1. ls\n2. cal\n3. pwd\n4. whoami\n5. exit"); printf("Input> "); gets(&s); if ..