System/PWNABLE

    [HackCTF] Gift

    check - 32bit - NX Analyze psuedo code - binsh 문자열의 주소와 system 함수의 주소를 출력한다. - 128byte만큼 사용자로부터 fgets함수를 통해 입력받고 입력받은 내용을 출력한다. - printf(&s)에서 포맷스트링을 직접 출력인자로 넣으면서 FSB 취약점이 발생한다. - 0x84byte만큼 할당되어 있는 스택 버퍼 s에 gets를 통해 길이 제한없이 값을 입력받으면서 BOF 취약점이 발생한다. - 변수 binsh는 bss 영역에 정의된 초기화되지 않은 변수이다. 즉 binsh 변수에 "/bin/sh\x00"을 저장하여 사용할 수 있을 듯 하다. + bss 영역이기 때문에 ASLR이 적용되어 있어도 주소값이 달라지지 않는다. 실행 - 변수 binsh와 s..

    [HackCTF] Look at me (재)

    check - 32bit - NX - Partial RELRO - statically linked library >> 많은 함수들이 바이너리 파일 내에 저장되어 있고 plt와 got 주소가 따로 분리되어 있지않다. Analyze pseudo code - 0x18byte만큼 할당받은 스택 버퍼 v1에 gets함수를 통해 값을 입력받는다. 이 때 크기 제한이 없기 때문에 오버플로우가 발생할 수 있다. functions system 함수와 "/bin/sh" 문자열이 현재 바이너리에 포함되어 있지 않다 + statically linked library >> system함수 호출이 아닌 다른 방식으로 exploit 할 수 있어야한다! ex. mprotect / execve(int 0x80) >> "/bin/sh"..

    [HackCTF] RTL core

    check - 32bit - NX - 라이브러리 파일이 문제파일과 함께 주어졌다. Analyze pseudo code - main 함수 중 0x1c byte만큼 할당되어 있는 문자열 s에 gets함수를 통해 사용자로부터 입력받는다. - 사용자로부터 입력받은 password를 check_passcode에 인자로 전달하고 리턴되는 값이 hashcode와 같으면 어떤 문자열을 출력하고 core()함수로 연결된다. - main함수에서 매개변수 a1의 자리에 &s를 전달했다. 즉, 입력한 passcode의 주소를 전달한 것이다. for문에서는 passcode의 주소를 4씩 끊어 값을 참조하고 더하는 연산을 반복한다. AAAABBBBCCCCDDDD를 passcode로 입력해봤다. 이런식으로 AAAA(0x414141..

    [HackCTF] Random Key

    check - 64 bit - NX Analyze pseudo code - random 변수 v5를 생성하고 일반 변수 v4의 값을 입력한 후 v4가 v5와 값이 같으면 플래그를 출력한다. 실행 >> rand 함수에 대한 이해가 필요한 문제이다. - rand 함수 int rand(void) :랜덤한 숫자를 반환하는 함수로, stdlib.h 헤더파일에 포함되는 함수이다. 하지만, srand함수와 time 함수 없이 rand 함수만 사용하게 되면 일정한 순서의 숫자들이 반환된다. - srand 함수 void srand(unsigned int seed) : 매개변수로 전달되는 seed를 이용해 rand 함수에 사용될 수를 초기화한다. 즉, seed 값에 의해 rand 함수의 결과값이 달라지는 것이다. - ti..

    [HackCTF] 1996

    check - 64bit - NX Analyze pseudo code 실행 - 환경변수를 입력하면 환경변수의 값을 출력해준다. - 환경변수를 입력받을 때 name 변수에 저장하는 듯 하다. name 변수는 0x410 byte만큼 할당되어 있고, 길이제한 없이 값을 입력받는다. - 입력받은 이름(값)을 getenv 함수를 통해 찾아낸다. Exploit from pwn import * p = remote("ctf.j0n9hyun.xyz", 3013) pl = "A"*(0x410 + 8) pl += p64(0x400897) p.sendline(pl) p.interactive() C++라서 이해가 잘 안되는 코드들이 많았지만,,, 실행해보면서 대충 어떤 식으로 payload를 짜면 될 지 감이 왔고 겁먹은 만큼..

    [HackCTF] g++ pwn

    check - 32 bit - NX Analyze pseudo code C++ 코드로 되어 있어서 우선 익숙하지 않아 해석하는게 가장 문제다.. - s 에 0x3c (=60)byte만큼 할당하고 fgets함수를 통해 32byte만큼 읽어들인다. 이 때에는 길이 제한이 생겨 버퍼오버플로우를 일으킬 수 없다. - 정확히 코드들을 해석하기는 어렵지만,, 실행결과를 참고해서 보면 "I"를 입력하면 s의 내용이 저장된 input변수에 "I"를 저장하고 이를 v1에 저장하면서 you를 대신 저장하여 문자열 s에 복사하고 문자열을 출력한다. >> 입력할 때에는 32byte라는 길이제한이 있었지만 strcpy함수를 사용할 때는 길이제한을 두지 않았기 때문에 복사하면서 오버플로우 시킬 수 있다. 실행 - "I"를 입력했..

    [HackCTF] Poet

    check - 64bit - NX Analyze pseudo code - 초기화되지 않은 전역 변수 poem이 bss 영역에 1024byte만큼 할당되어있다. 이 때 poem의 값을 gets 함수로 읽어들이며 버퍼오버플로우 취약성이 발생한다. - dword_6024E0 변수는 점수라고 생각하면 되고, 매번 get_peom() 함수를 호출할 때마다 0으로 초기화한다. - poem을 dest에 복사한다. dest 변수는 0x410 byte만큼 할당되어 있다. - dest 에 "ESPR", "eat", "sleep", "pwn", "repeat", "CTF", "capture", "flag" 의 단어들이 포함되어 있을 때마다 100점의 포인트를 추가한다. - reward() 함수에 도달하기 위해서는 rate_..

    [HackCTF] RTL_World

    check - 32bit - NX만 걸려있다. Analyze pseudo code 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 68 69 70 71 72 73 74 75 76 77 78 int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // [esp+10h] [ebp-90h] char buf; ..

    [HackCTF] Yes or No

    check - 64bit - NX 가 걸려있다 - 18.04에서 만들어진? 테스트된 문제라고 한다. Analyze pseudo code (IDA 사용) 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 int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax int v4; // eax int v5; // ecx int v6; // eax int v7; // eax char s; // [rsp+Eh] [rbp-12..

    [HackCTF] BOF_PIE

    check - 32 bit - NX와 PIE가 설정되어 있다 >> Analyze pseudo code - v1에 ebp로부터 0x12 byte 떨어진 곳에 할당하고 scanf("%s")를 통해 v1의 값을 읽어들인다. 이 때 스택 버퍼 오버플로우 취약성이 발생한다. - welcome 함수의 주소를 출력한다. - 아무래도 이 문제의 목표는 Return address를 j0n9hyun으로 하여 플래그를 따는 것 같다! - welcome 함수의 주소가 매번 출력되기 때문에 그 값을 읽어들이고, j0n9hyun과 welcome의 offset은 항상 같으므로 둘의 차(0x909 - 0x890)를 이용해 j0n9hyun함수를 Return address로 덮는다. 실행 Exploit from pwn import * ..