목록분류 전체보기 (553)
Self-Improvement
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #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 ..
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 #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("J..
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #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; } Colored by Color Scripter cs rand() 함수로 랜덤하게 값을 생성해주지만 seed() 없이는 동일한 값이 출력된..
소스 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #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"..
풀이 pwnable.kr/bin/flag에서 파일을 다운로드하여 실행해 본다. malloc()하고 strcpy 수행만 한다고 되어있다. IDA로 열어서 확인해 보면 제대로 분석이 되어지지가 않는다.. 확인을 해보니 UPX로 패킹이 되어있는 것 같다. UPX 언패킹을 수행한 후에 다시한번 분석을 해본다. upx -d ./flag IDA로 다시한번 확인해 보니 정말로 malloc()와 strcpy() 함수만 수행하고 종료가 되어진다. strcpy() 인자로 넘어가는 레지스터 값을 확인해보면 flag 표시가 되어있으며 확인하면 flag 값을 얻을 수 있다.
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #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; } Colored by Color Scripter cs gets()함수에서 bof가 발생하여 key 값이 저장된 주소까지 덮어씌울 수 있다. * func..
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #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
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include #include #include char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc
FILE 적용된 보호기법 IDA input_name의 크기는 (0x20-0x8)로 0x18크기이며 스택의 바로 아래에는 canary가 존재하고 있다. Main함수에서 name을 입력 받을때 read()함수로 0x28크기만큼 받고 있음으로 input_name 변수의 크기보다 0x10바이트 만큼 더 입력 할 수 있음으로 canary leak을 할 수 있다. 그 다음 아래에서 bof에 취약한 scanf() 함수로 문자열을 입력 받고 있음으로 BOF를 수행할 수 있다. 친절하게도 바이너리 파일안에 helper()함수로 system("/bin/sh")이 존재하고 있다. 결론적으론 1. read() 함수에서 canary을 leak 한다. 2. scanf() 함수에서 BOF로 ret 영역에 helper() 함수를 덮..
https://py0zz1.tistory.com/107 Return-to-Csu 기법 정리 포너블 문제를 풀 때, 64Bit 바이너리가 까다로운 이유가 바로 'Gadget' 때문이다. 64Bit의 Calling Convention은 Fastcall로 호출된 함수에 인자를 레지스터로 전달한다. 이 때문에 Exploit을 구성할 때도 [POP R. py0zz1.tistory.com 위 블로그에 잘 나와있다!! 강추 중요한점은 set_csu를 한번만 진행하면 chaning으로 인해 계속 진행이 되어진다.