이번 포스트에서는 Pwnable의 leg 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\n" "pop {r6}\n" ); } int key3(){ asm("mov r3, lr\n"); } int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (key1()+k..
이번 포스트에서는 Pwnable의 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['A'],"\x00")) return 0; if(strcmp(..
이번 포스트에서는 Pwnable의 random 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include int main(){ unsigned int random; random = rand(); // random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; } ## 문제 해석 : 해당 문제의 코드를 살펴보니 key값과 random값의 XOR 연산 값이 0xdeadbeef가 되어야 해결할 ..
이번 포스트에서는 Pwnable의 passcode 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\n"); if(passcode1==338150 && passcode2==13371337){ printf("Login OK!\n")..
이번 포스트에서는 Pwnable의 flag 문제에 대해 다루겠다. 문제 파일을 실행하면 다음과 같다. ## 문제 해석 : IDA를 활용하여 문제를 분석해보면 다음과 같이 UPX로 패킹되어 있다는 사실을 알 수 있다. ## 문제 풀이 : upx -d 를 통해 해당 파일을 언패킹한 다음에 분석해보아야 한다. 언패킹한 파일을 다시 IDA를 통해 실행해보면 다음과 같이 flag값이 나오는 것을 확인할 수 있다. ## 최종 결과 : Flag = UPX...? sounds like a delivery service :)
이번 포스트에서는 Pwnable의 bof 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme);// smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } ## 문제 해석 : 문제 코드를 살펴 보니, 우리가 입력한 값이 overflowme 라는 변수에 저장되고 해당 변수의 크기가 32바이트인 것을 알 수 있다..
이번 포스트에서는 Pwnable의 collision 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i> hashcode = 0x21DD09EC >>> hex(hashcode/5) # 5로 나누었을 때의 값 '0x6c5cec8' >>> hex(hashcode%5) # 5로 나누었을 때의 나머지 '0x4' >>> hex(hashcode/5+hashcode%5) # 5로 나누어 떨어졌을 때의 마지막 값(나머지 포함) '0x6c5cecc' >>> he..
이번 포스트에서는 Pwnable의 fd 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include #include char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc