System/PWNABLE

    [POXX 2020] tips

    checksec - 64bit - NX - not stripped - statically linked >> plt와 got가 따로 구분되지 않는다. Analyze Pseudo Code 함수리스트를 살펴보면 가젯을 심어둔 함수가 있음을 확인할 수 있다. 실행 "/bin/sh"문자열이 포함되어 있지 않아 따로 writableArea에 넣어줘야한다. bss 영역: 0x6cbb60 gadgets syscall ; ret ; = 0x43ef25 pop rax ; pop rdx ; pop rdi ; pop rsi ; ret ; = 0x4009bc pop rdx ; pop rdi ; pop rsi ; ret ; = 0x4009bd pop rax ; ret ; = 0x41f854 SROP 방식으로 exploit 코드를..

    [POXX 2020] investigator

    checksec - 64bit - Partial RELRO - No Canary - NX Analyze Pseudo Code int __cdecl main(int argc, const char **argv, const char **envp) { __uid_t v3; // eax const char *v4; // rdi int v6; // [rsp+18h] [rbp-8h] int v7; // [rsp+1Ch] [rbp-4h] setvbuf(stdout, 0LL, 2, 0LL); v3 = getuid(); seteuid(v3); v7 = 0; puts("---------------------------------------------------"); puts("####FIND####THE####VACCINE..

    [LOB] gremlin → cobolt

    gate에서 gremlin으로 사용자 변경을 해주고 gate에서 얻은 gremlin의 비밀번호를 입력한다. 그리고 gate 단계에서 사용자만 변경했기 때문에 gate 권한의 디렉터리에서 gremlin 권한의 디렉터리로 옮겨준다. Analyze - small buffer로 buffer의 크기가 16byte밖에 안된다. - strcpy 함수에서 스택 버퍼 오버플로우 취약점이 발생한다. - buf[16] + SFP[4] + RET[4] = 24byte - 32bit - dynamically linked - not stripped debugging Payload 버퍼의 크기가 쉘 코드를 모두 입력받기에 너무 작기 때문에 쉘코드를 환경변수로 저장하여 환경변수를 호출하도록 한다. BUF+SFP (20) || RET..

    [LOB] gate → gremlin

    xshell에 연결했다. 안전하게 사용하기 위해.. gremlin을 복사해 g를 만들었다. 항상 시작전에 $ bash2 입력하기! Analyze - simple bof 문제 - strcpy 함수에서 buffer overflow 취약성이 나타나기 때문에 이 함수에 bof를 일으켜 문제를 풀면 될 것이다. - buffer(256) + SFP(4) + RET(4) 이런식으로 넣으면 될 것 같다. - argc가 2개 미만일 때(=명령어만 있는 경우) 오류메시지를 출력하고 종료한다. - 위의 조건에서 통과된다면 인자로 입력한 argv[1]이 버퍼에 복사되고 그 주소가 출력될 것이다. - 32bit - not stripped - dynamically linked debugging strcpy함수를 실행하여 buff..

    [Dreamhack] house_of_force

    checksec 32bit Canary발견되지만 heap문제니까...상관없을듯 Pseudo code int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax int v5; // [esp+0h] [ebp-10h] int v6; // [esp+4h] [ebp-Ch] int v7; // [esp+8h] [ebp-8h] unsigned int v8; // [esp+Ch] [ebp-4h] v8 = __readgsdword(0x14u); v6 = 0; v7 = 0; initialize(); while ( 1 ) { while ( 1 ) { puts("1. Create"); puts("2. Write"); puts("3. Exi..

    [HackCTF] uaf

    checksec 32bit Canary발견 (pwntools 새로운 버전이 나왔다..업데이트 해야지..) Pseudo Code IDA 32bit 로 확인 int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // eax char buf; // [esp+8h] [ebp-10h] unsigned int v5; // [esp+Ch] [ebp-Ch] v5 = __readgsdword(0x14u); setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); while ( 1 ) { while ( 1 ) { menu(); read(0, &buf, 4u); v3 = atoi(&buf);..

    first

    checksec 64bit Pseudo Code int __cdecl main(int argc, const char **argv, const char **envp) { puts("This is my FIRST PWNABLE!!"); return load(10); } ssize_t __fastcall load(int a1) { unsigned int v2; // [rsp+Ch] [rbp-14h] int v3; // [rsp+1Ch] [rbp-4h] v2 = a1; puts("How Many Bullets do you have?"); scanf("%d", &v3); if ( a1 > v3 ) v2 = v3; printf("You have %dbullets\n", v2); return bang(); } ssi..

    [HackCTF] RTC

    checksec Pseudo Code int __cdecl main(int argc, const char **argv, const char **envp) { char buf; // [rsp+0h] [rbp-40h] setvbuf(stdin, 0LL, 2, 0LL); write(1, "Hey, ROP! What's Up?\n", 0x15uLL); return read(0, &buf, 0x200uLL); } 0x40byte만큼 할당받은 buf 변수에 0x200byte만큼 read함수를 통해 읽어들이려하면서 overflow 발생가능 >> read함수를 이용해 buf변수에 0x40 + 8 byte 만큼 문자열을 채워주면 return address를 덮어 쓸 수 있을 것이다 Payload gadget gadget..

    baby1

    checksec 64bit NX bit Pseudo Code int __cdecl main(int argc, const char **argv, const char **envp) { char buf; // [rsp+0h] [rbp-30h] setvbuf(_bss_start, 0LL, 2, 0LL); write(1, "Welcome to securinets Quals!\n", 0x1DuLL); return read(0, &buf, 0x12CuLL); } buf 변수에 0x30 byte 를 처음 할당하고 read 함수를 통해 0x12C 만큼 읽는다. >> buffer overflow 취약성 발생 0x30byte 이상 문자를 입력하면 return address를 덮어쓸 수 있다. Payload gadget ga..

    [HackCTF] SysROP

    checksec 64bit Pseudo Code read함수를 통해 buf변수에 0x78byte 입력받음 buf 변수는 0x10만큼 할당받았기 때문에 OVERFLOW 취약성이 발생 >> 0x10(16) + 8(SFP) 만큼 채우면 RET 값을 덮어 쓸 수 있을 것 main함수는 text파일로 쓰여졌으며 0x4005f2에 저장되어있다. Payload /bin/sh "/bin/sh"이 없기 때문에 read함수를 통해 써야한다 .data = 0x601030 .bss = 0x601040 데이터 영역에 "/bin/sh"을 덮어쓴다. gadget read함수를 사용해 "/bin/sh" 문자열을 덮기 위해 pop rdx ; pop rdi ; pop rsi ; ret ; 가젯을 찾는다(이유:리눅스 64bit 환경에서의..