System/PWNABLE

    [pwnable.kr / Toddler's Bottle] fd

    ✏️ Check 문제에서 제공하는 ssh 로 접속하면 fd 문제 파일과 fd.c 소스코드 파일, 읽기 권한이 없는 flag 파일이 저장되어 있다. 🔎 Analyze if(argc

    [pwnable.xyz] add

    check 64 bit ELF Canary NX analyze pseudo code (IDA) if 문의 조건으로 들어간 isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 은 scanf에 인자로 들어가는 값이 3개가 안되는 경우를 의미한다. scanf의 리턴 값은 scanf를 통해 입력받은 값의 개수를 나타내는데, 이 때 scanf내에서 사용한 포맷스트링과 실제 입력값이 같지 않은 경우는 리턴 값에 포함시키지않는다. 따라서, 현재의 경우에는 정수값이 아닌 문자, 문자열등을 입력하게 되면 while문을 break하게 된다. 배열 v7은 int64 타입의 11개의 인덱스를 가지는 배열로, 한 인덱스당 8byte를 갖는다. 하지만, 실제 v7의 크기를 살펴보면 rbp-60h..

    [HackCTF] Register

    check Partial RELRO >> GOT overwrite 가능 Canray NX 64 bit Analyze main()함수 alaram함수를 호출하고 build()함수를 호출한다. unsigned int alarm (unsigned int secs); seconds 초 후에 프로세스에 SIGALARM(14)을 전달한다. SIGALARM의 기본행동은 프로세스 종료이다. build()함수 #(build)13 void (*signal(int signum, void (*handler)(int)))(int); 시그널 처리 함수로, 특정 시그널(signum)이 발생했을 때, 어떻게 처리를 할 것인지 시그널 핸들러를 직접 지정해주는 함 sigum: 각 시그널별로 지정된 숫자(순번) handler: 시그널을 ..

    [ROP Emporium] write4 (재)

    Check - Partial RELRO --> got 덮어 쓸 수 있음 - NX Analyze pseudo code (IDA pro) main 함수에서 라이브러리 함수인 pwnme()를 호출한다. 0x20 byte만큼 할당한 스택 버퍼 s에 read함수를 통해 0x200 byte까지 입력받을 수 있도록 하면서 버퍼 오버플로우 취약점이 발생한다. 라이브러리 함수인 print_file을 호출해 "nonexistent"라는 인자를 전달하고 있다. >> 여기서 "nonexistent"의 값을 flag.txt로 바꿔서 플래그를 출력할 수 있도록 해야할 것 같다!! gadgets pop rdi ; ret ; = 0x400693 printf_file함수를 호출하는 영역: 0x400620 그 아래를 살펴보니 usefu..

    [HackCTF] Unexploitable_1

    check - 64bit - NX Analyze pseudo code (IDA) - 0x10byte만큼 할당된 스택 변수(문자열) s에 fgets함수를 이용해 64byte (= 0x40 byte)만큼 입력받는다. 이 때 버퍼오버플로우가 발생할 수 있다. - main함수의 내용을 보면 system@plt를 이미 가지고 있다고 한다. 그래서 IDA를 통해 좀 더 살펴보면 이런 함수가 있고 이 가젯을 사용하라고 한다. 어셈블리 코드로 다시 확인해보면 "call system" 가젯을 사용할 수 있는게 아닌가 싶다. - "call system" : 0x4006d4 gadgets Exploit (1) from pwn import * #context.log_level = 'debug' #p = process("./U..

    [ROP Emporium] callme

    check - 64 bit - NX - Partial RELRO Analyze pseudo code - main()함수는 앞의 문제들과 같다 - 스택 버퍼 s에 0x20byte만큼 할당하고 read 함수를 통해 0x200byte만큼 입력받을 수 있도록 되어 있다. - callme_three(4,5,6), callme_two(4,5,6), callme_one(4,5,6)이라는 함수를 호출한다. rop_emporium hint callme_one(0xdeadbeefdeadbeef, 0xcafebabecafebabe, 0xd00df00dd00df00d) > callme_two(~~) > callme_three(~~) 순서로 rop chain을 만들어줘야한다. gadgets pop rdi ; pop rsi ; ..

    [ROP Emporium] split32

    check - 32bit - NX Analyze pseudo code는 앞에서 풀었던 split 과 동일하다. 문자열 s의 크기가 0x28byte로 할당되어있다!! - "/bin/cat flag.txt" 문자열은 data 영역인 0x804a030에 있다. - call system 코드의 주소는 0x804861a이다. gadget >> 따로 가젯을 호출할 필요가 없다 Exploit payload: BUF[0x28] + SFP[4] + SYSTEM(call system: 0x804861a) + BINSH(usefulString: 0x804a030) from pwn import * #context.log_level = 'debug' p = process("./split32") elf = ELF("./split..

    [RopEmporium] split

    check - 64bit - NX Analyze pseduo code (IDA) - 0x20 byte인 스택버퍼 s에 read함수를 통해 0x60byte만큼 입력받는 부분에서 버퍼오버플로우 취약점이 발생한다. >> 이 때 함수 리스트에 보이는 'usefulFunction'으로 리턴하면 될 것 같다. - 하지만, 이번에는 system("/bin/ls");로, 우리가 필요한 것은 "/bin/cat flag.txt"이다. IDA에서 [Shift]+[F12]를 누르면 아래와 같이 바이너리 내에 저장되어 있는 문자열들의 리스트를 보여준다. - "/bin/cat flag.txt"(usefulString)가 있다. usefulFunction에서 system함수의 인자로 호출되는 0x40084a: /bin/ls 를 덮..

    [ROP Emporium] ret2win

    check - 64bit - NX만 걸려있음 Analyze pseudo code (IDA) - 친절하게 힌트도 준다: read(0, &s, 0x38)에 대한 설명문으로, 0x20byte 크기의 스택 버퍼 s에 56byte를 입력한다는 점과 read()함수를 사용하기 때문에 NULL 바이트에 대해 걱정할 필요가 없다는 메시지이다. - 위 힌트에서 다 알려줬듯이 0x20byte만큼 할당된 스택버퍼 s에 그 이상의 값을 read함수를 통해 입력받기 때문에 BOF 취약점이 발생한다. - 함수목록을 살펴보면 ret2win이라는 함수가 있다. 이 함수는 system("/bin/cat flag.txt")를 호출하므로 이 함수로 이어지게 ROP chain을 만들면 될 것 같다. Exploit payload: BUF[0..

    [HackCTF] Pwning (재)

    check - 32bit - Partial RELRO >> .got.plt 영역을 덮어쓸 수 있다 - NX Analyze pseudo code - atoi 함수를 이용해 문자 nptr값을 정수 v2로 바꾼다. - [get_n 호출 1] get_n 함수의 매개변수 a2에 4를 인자로 전달한다. get_n 함수의 반복문을 총 5번 반복하며 v4에 5개의 값을 입력받을 수 있다. - [get_n 호출 2] get_n 함수에 nptr주소값과 v2를 인자로 전달한다. get_n 함수의 반복문을 총 v2번 반복하며 v4에 v2개의 값을 입력받을 수 있다. >> get_n의 두 번째 인자로 v2를 전달할 때 v2이 데이터형은 int 형이지만, 매개변수 a2의 타입은 unsigned int이다. 즉, 음수를 입력하게 ..