System/PWNABLE

    [HackCTF] BASIC_FSB

    check - 32bit - 딱히 보호기법이 적용되어 있지는 않다. Analyze pseudo code - fgets 함수를 통해 문자열 s에 표준입력으로 1024byte만큼 입력받고, s에 저장된 값을 0x400byte만큼 format에 저장한다. 그리고 printf에 format을 통째로 집어넣으면서 FSB가 발생한다. - format의 주소를 찾아야겠다! - format에서 발생하는 FSB를 이용해 printf의 got 주소를 flag의 주소로 덮는다. - flag 함수의 주소는 0x80485b4 = 134514100 실행 입력한 데이터가 첫번째 포맷스트링x부터 차례로 쓰여지는 것을 확인할 수 있다. Exploit printf@got 주소 4byte의 영향을 받기 때문에 flag 함수의 주소에서 4..

    [HackCTF] Simple_Overflow_ver_2

    check - 32bit - 바로 앞의 문제와 같이 별다른 보호기법은 적용되어 있지않다. Analyze pseudo code 실행 - v5는 Again(y/n)에 대한 답을 저장하는 변수로, v5의 값이 121 또는 89인 동안 데이터를 입력받는 반복문이 지속된다. 이 때 121과 89는 각각 Y, y의 10진수값이다. - v5는 ebp로부터 0x89byte떨어진 곳에 위치하고 scanf 함수를 통해 값을 입력받는다. 이 때 scanf에서 몇 바이트를 입력받는지 정해두지 않았기 때문에 버퍼 오버플로우가 발생할 수 있다. >> scanf("%c")로 문자를 입력받기 때문에 overflow 시키기에 적합하지 않다. - 데이터는 s에 저장되고 16개씩 끊어 "주소: 값"이 출력되도록한다. >> 쉘코드를 s에 ..

    [HackCTF] x64 Simple_size_BOF

    check - 64bit - Partial RELRO - 보호기법이 (RELRO빼고) 적용되어 있지않다 Analyze pseudo code - 스택 버퍼 v4는 rbp로부터 0x6d30 byte 떨어진 곳에 위치한다. 스택 버퍼 v4의 주소를 출력하고 gets 함수를 통해 입력받는다 >> 버퍼 오버플로우가 발생할 수 있다. 실행 Exploit 우선 buf의 주소를 출력해주니까 이를 잘 읽어내야한다! LOB 문제 풀 때처럼 쉘코드를 버퍼에 넣고 BUF[0x6d30]+SFP[8] - len(쉘코드) 만큼 dummy값을 채워줘 버퍼 오버플로우를 일으키고 RET주소로 buf의 주소값을 전달해 버퍼에 저장한 쉘코드를 실행시키도록 한다. from pwn import * #context.log_level = 'deb..

    [HackCTF] x64 Buffer Overflow

    check - 64bit - NX만 설정되어 있음 >> 단순한 return address 변조로 풀 수 있을 것! Analyze pseudo code - 스택 버퍼로 s를 만들고 ebp로부터 0x110byte 떨어진 곳에 위치한다. 그리고 scanf 함수를 통해 입력받는다. 이 때 입력받는 크기를 특정하지않기 때문에 Buffer Overflow가 발생할 수 있다. - 변수 v5에는 문자열 s의 길이가 저장된다. - 수상한 함수인 callMeMaybe.. - 이 함수를 RET 값으로 주면 execve("/bin/bash")가 실행되어 쉘을 딸 수 있을 것 같다. Exploit from pwn import * p=remote("ctf.j0n9hyun.xyz", 3004) pl="A"*(0x110) pl+="..

    [LOB] orc → wolfman

    $ bash2 $ ulimit -c unlimited $ mkdir tmp $ cd wolfman tmp/wolfman Analyze source 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 /* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc > BUF[40]+SFP..

    [HackCTF] 내 버퍼가 흘러넘친다!!! (prob1)

    check - 32bit - NX 적용 X Analyze pseudo code - 간단하게 main 함수에서 해결할 수 있는 문제이다 - name 변수는 IDA를 통해 확인하니 bss 영역에 저장되어있다. name은 전역변수(public)으로 선언되어 따로 초기화되어있지는 않은 값으로 bss 영역에 저장되어 있다. >> bss영역과 데이터 영역의 차이는 shinluckyarchive.tistory.com/159 이 블로그에서 잘 설명해주셨다! - read 함수를 이용해 name 변수의 위치(bss영역)에 쉘코드를 저장하고 gets 함수에서의 값을 입력받으면서 쉘 코드를 저장한 영역을 리턴주소로 덮어쓰면서 쉘 코드를 실행시키도록 할 수 있을 것 같다! Exploit from pwn import * #p =..

    [HackCTF] offset

    check - 32bit - Full RELRO - PIE Analyze Pseudo Code (IDA) - select_func 함수에서 src는 main함수에서 s를 받는다. - select_func에서 strncpy함수를 이용하여 dest에 src의 내용을 0x1F(31byte)만큼 복사한다. - one, two 함수는 단순하게 문자열을 출력하는 함수이다. - select_func에서는 포인터 v3에 함수 two를 리턴했다. select_func이 종료될 때 v3이 리턴된다. 즉, v3이 가리키는 함수가 리턴되므로 이 값을 조작하면 원하는 함수를 리턴할 수 있을 것 같다. - 그리고 dest와 v3 사이의 거리는 0x2A-0xC (=42-12) = 30byte이다. 따라서, src에서 dest로 복..

    [HackCTF] basic_bof2

    checksec - 32bit - Partial RELRO Analyze pseudo code - 스택 버퍼에 문자열 s에 fgets 함수를 이용해 133byte만큼 표준입력을 통해 입력받도록 한다. 하지만 이 때는 133

    [HackCTF] ROP

    checksec - 32bit - No Canary - NX +) 라이브러리 파일(libc.so.6)이 따로 있으므로 이 점 주의 Analyze pseudo code vulnerable_function 함수에서 buf를 0x88byte만큼 할당하고 read함수를 통해 0x100 byte 읽으면서 stack buffer overflow가 발생한다. write함수의 plt와 got 값을 이용해 libc를 leak하도록 한다 >> 가젯을 찾아야한다. gadgets read함수와 write함수 모두 인자를 3개씩 가지는 함수이므로 pppr 가젯을 찾아야한다. pop esi ; pop edi ; pop ebp ; ret ; 가젯 주소 = 0x8048509 pop ebp ; ret ; 가젯 주소 = 0x804850..

    [HackCTF] bof_basic

    checksec - 32bit - Partial RELRO - NX Analyze Pseudo Code (IDA) 실행 - 사용자로부터 문자열(buf) s의 값을 fgets함수를 통해 입력받도록 되어있다. - s와 v5 사이의 거리는 0x34 - 0xC = 52-12 = 40byte - 바꿔야 될 값이 v5이고 s와 v5 사이의 거리가 40byte이기 때문에 fgets함수에서 45byte로 제한했음에도 bof 공격이 가능해진다. - v5가 0xdeadbeef일 때 system("/bin/sh") 이 실행되니까 "A"*40 + 0xdeadbeef 의 꼴로 payload를 작성하면 될 것이다. "A"*40 + "BBBB"를 입력했더니 v5의 주소가 "BBBB"로 덮인 것을 확인할 수 있다. Exploit f..